我在ViewController上有一个属性,我从父SplitViewController设置:
财产声明/合成
@interface DownloadRecipesViewController_iPad : DownloadRecipesViewController<PopoverMenuDelegate, RecipeChangeDelegate>{
id <NSObject, PopoverMenuParentDelegate, RecipeChangeDelegate, RecipeDownloadedDelegate> _selectionDelegate;
}
@property (strong) UIBarButtonItem *btnMenu;
@property (strong) id <NSObject, RecipeChangeDelegate, RecipeDownloadedDelegate> selectionDelegate;
@implementation DownloadRecipesViewController_iPad
@synthesize btnMenu;
@synthesize selectionDelegate = _selectionDelegate;
我在父SplitViewVC的viewDidLoad
方法中连接了委托:
联系代表
self.downloadVc = [self.storyboard instantiateViewControllerWithIdentifier:@"RecipeDownload"];
[self.downloadVc setSelectionDelegate:self];
Child VC中的一个按钮调用一个方法来触发事件直到父ViewController,但是当调用此事件时,委托是nil并且不触发该事件。我绞尽脑汁试图找出原因,但我完全失去了。
此处的代表是零(解雇代理):
-(IBAction)didTapMenu:(id)sender{
if([_selectionDelegate respondsToSelector:@selector(shouldToggleMenu)])
[_selectionDelegate shouldToggleMenu];
}
我也尝试过没有支持属性但遇到同样的问题。
答案 0 :(得分:0)
有关如何查找以下内容的建议。但首先,为什么不保存自己的一些打字并删除ivar并删除@synthesize - 这是完全不必要的打字。此外,正如评论所说,代表们几乎总是被打成弱者。
建议:
1)为 selectionDelegate 写一个(临时)setter,然后设置一个断点,在那里你实际设置值(或之后),这样你就可以验证它的设置,并且没有别的把它归零。
2)在IBAction方法的if语句所在的行上设置一个断点,当你点击它时,验证对象是你设置委托的对象,委托值是什么,然后查看是否 respondsTo 方法成功(使用单步)。
答案 1 :(得分:0)
我最终解决这个问题的方式是:
-(void)segueBeginning:(UIStoryboardSegue*)destination
使用此委托将子UINavigationController中的prepareForSegue公开给父SplitViewController 0.3。当在子导航控制器中引发prepareForSegue时,在父ViewController中连接我的子VC:
if([destination.destinationViewController isKindOfClass:[DownloadRecipesViewController_iPad class]] && !self.downloadVc){ // download recipes
self.downloadVc = destination.destinationViewController;
self.downloadVc.selectionDelegate = self;
[self.downloadVc setSnapshotChangeDelegate:self];
[self.downloadVc.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:btnAdd, nil]];
}