委托对象在设置之前存在于目标视图控制器中,但在设置后为0x000 ..为什么?

时间:2012-09-14 03:06:17

标签: objective-c ios uiviewcontroller delegates uistoryboard

我正在疯狂地对待我确信是一个基本错误,但我找不到它。我有简单的代表,一切都有效,除了这一个。我看不出我通常处理事情的方式有什么不同。

@interface MasterViewController () <DetailViewControllerDelegate, SettingsViewControllerDelegate>

@end

@implementation MasterViewController

....

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

if([[segue identifier] isEqualToString:@"ShowSettings"]) {
    // here settingsViewController._delegate is 0x075...
    // why? where is this coming from?
    SettingsViewController *settingsViewController = [segue destinationViewController];
    // here settingsViewController._delegate is 0x00000 which I would expect
    [settingsViewController setDelegate:self];             
    // here settingsViewController._delegate is still 0x0000 -- why?
  }
}

3 个答案:

答案 0 :(得分:1)

你确定 - [SettingsViewController委托]的支持iVar是_delegate吗?你可能有一个@syntehsize委托;这条线会导致iVar成为'委托'。调用setDelegate后,在调试器中尝试“p * settingsViewController”,并确保没有更多的实例变量。

答案 1 :(得分:0)

最可能的原因是[segue destinationViewController]nil。或者,您可能有一个未正确实现的自定义setDelegate:

答案 2 :(得分:0)

我修好了。这花了太长时间。我已经吸取了教训。感谢Jon提醒我使用调试器!

    SettingsViewController *settingsViewController = [segue destinationViewController];        
    NSArray *childViewControllers = [NSArray arrayWithArray:[settingsViewController childViewControllers]];
    [[childViewControllers objectAtIndex:0] setDelegate:self];

它有效,但这是正确的方法吗? [segue destinationViewController]是一个UINavigationController。