我声明了一个协议方法,以便被它的委托调用。这是相关代码:
协议被声明的视图:
类别视图控制器.h
@class CategoryViewController;
@protocol CategoryViewControllerDelegate<NSObject>
-(void)loadProductsList:(id)sender;
@end
@interface CategoryViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>
{
id delegate;
}
@property(nonatomic, strong)id <CategoryViewControllerDelegate>delegate;
类别视图控制器.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
,在viewDidLoad的方法中MainViewController
,我将委托设置为self:
-(void)viewDidLoad{
//Use a property of CategoryViewController to set the delegate
self.categoryController.delegate = self;
}
-(void)loadProductsList:(id)sender{
//Logic
}
让我向您解释一下,CategoryViewController
它是由 a 管理的,UINavigationController
所以当单击一个单元格时,我会创建一个新实例CategoryViewController
并将其推送到导航堆栈。然后我调用协议方法:
if([self.delegate respondsToSelector:@selector(loadProductsList:)]){
[self.delegate loadProductsList:[arrayCategory objectAtIndex:indexPath.row]];
}
CategoryViewController
问题是,当当前视图为 0 索引时,委托仅对根视图有效。然后委托为空,因此loadProductsList:
当我尝试从堆栈视图索引 1、2 等调用它时无法触发协议方法。当我返回索引 0(导航堆栈中的根视图)时,委托对象再次有效我可以调用协议方法。
我的问题是:
为什么我在创建新实例CategoryViewController
并将其推送到导航堆栈后无法触发协议方法?为什么委托对象会为空呢?提前谢谢。