我声明了一个协议方法以便被其委托调用。这是相关代码:
协议被删除的视图:
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
}
让我向您解释,
CategoryViewController
由UINavigationController
管理,因此,单击单元格时,我将创建一个新的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/