CategoryViewController

CategoryViewController

我声明了一个协议方法以便被其委托调用。这是相关代码:

协议被删除的视图:

CategoryViewController.h

@class  CategoryViewController;
@protocol CategoryViewControllerDelegate<NSObject>
-(void)loadProductsList:(id)sender;


@end

@interface CategoryViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>
{

    id delegate;

}

@property(nonatomic, strong)id <CategoryViewControllerDelegate>delegate;

CategoryViewController.m
@implementation CategoryViewController

@synthesize delegate;

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
            CategoryViewController *catView = [[CategoryViewController alloc] initWithNibName:@"CategoryViewController" bundle:nil];
            [self.navigationController pushViewController:catView animated:YES];

            if([self.delegate respondsToSelector:@selector(loadProductsList:)]){
                [self.delegate loadProductsList:[arrayCategory objectAtIndex:indexPath.row]];
            }
    }

委托视图称为MainViewController,在MainViewController的viewDidLoad方法中,我将委托设置为self:
-(void)viewDidLoad{
    //Use a property of CategoryViewController to set the delegate

    self.categoryController.delegate = self;
}

-(void)loadProductsList:(id)sender{
//Logic


}

让我向您解释,CategoryViewControllerUINavigationController管理,因此,单击单元格时,我将创建一个新的CategoryViewController实例并将其推送到导航堆栈。然后我调用协议方法:
if([self.delegate respondsToSelector:@selector(loadProductsList:)]){
  [self.delegate loadProductsList:[arrayCategory objectAtIndex:indexPath.row]];
    }

问题在于,当CategoryViewController当前视图为0索引时,委托仅对根视图有效。然后,该委托为null,因此当我尝试从堆栈视图索引1、2等调用它时,无法激发协议方法loadProductsList:。当我返回索引0(导航堆栈中的根视图)时,委托对象有效再次,我可以调用协议方法。

我的问题是:

为什么在创建新的CategoryViewController实例并将其推送到导航堆栈后无法触发协​​议方法?为什么委托对象会为null?提前感谢。

最佳答案

您只能为CategoryViewController类中的一个(第一个)设置委托。

每次选择一行时,您都将创建一个新的CategoryViewController类,该类的委托为nil,因为您尚未设置它。

编辑,

我在这里看到两个选择。

a)您可以将MainController设置为一个单例,因此您可以从代码的任何位置访问它。然后,您就可以在didSelectRowAtIndexPath中将其设置为委托。

b)可以让代表通过

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
        CategoryViewController *catView = [[CategoryViewController alloc] initWithNibName:@"CategoryViewController" bundle:nil];
        [self.navigationController pushViewController:catView animated:YES];

        catView.delegate = self.delegate;

        if([self.delegate respondsToSelector:@selector(loadProductsList:)]){
            [self.delegate loadProductsList:[arrayCategory objectAtIndex:indexPath.row]];
        }
}

关于ios - 调用导航堆栈中的协议(protocol)方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15746395/

10-10 14:01