代表是零

时间:2013-04-13 13:53:00

标签: ios properties uiviewcontroller delegates synthesize

我在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];
}

我也尝试过没有支持属性但遇到同样的问题。

2 个答案:

答案 0 :(得分:0)

有关如何查找以下内容的建议。但首先,为什么不保存自己的一些打字并删除ivar并删除@synthesize - 这是完全不必要的打字。此外,正如评论所说,代表们几乎总是被打成弱者。

建议:

1)为 selectionDelegate 写一个(临时)setter,然后设置一个断点,在那里你实际设置值(或之后),这样你就可以验证它的设置,并且没有别的把它归零。

2)在IBAction方法的if语句所在的行上设置一个断点,当你点击它时,验证对象是你设置委托的对象,委托值是什么,然后查看是否 respondsTo 方法成功(使用单步)。

答案 1 :(得分:0)

我最终解决这个问题的方式是:

  1. 创建一个公开方法的新委托:-(void)segueBeginning:(UIStoryboardSegue*)destination
  2. 使用此委托将子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]];
    }