2012-12-27 59 views
2

我的问题可能是技术之一,而不是误解控制器和代表如何设置。也就是说,也许我应该做所有不同的方式......设置navigationController的rootViewController作为委托

无论如何,我有一个故事板设置与mainViewController。其中有一个UIButton,当点击时,它会延续到popover。 popover的内容视图控制器是UINavigationController,他的rootViewControllerMyViewController

我试图让mainViewControllerMyViewController一个delegate和我在prepareForSegue这样做:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:(@"popSleepSegue")] || [segue.identifier isEqualToString:(@"popAlarmSegue")]) 
    { 
     UIStoryboardPopoverSegue *popSegue = (UIStoryboardPopoverSegue *)segue; 
     popSegue.popoverController.delegate = self; 
     popSegue.popoverController.passthroughViews = [NSArray arrayWithObject:self.view]; 
     if ([segue.identifier isEqualToString:@"popAlarmSegue"]) 
     { 
      if ([[segue destinationViewController] isKindOfClass:[UINavigationController class]]) 
      { 
       UINavigationController *uNC = (UINavigationController *)[segue destinationViewController]; 
       MyViewController *aVC = (MyViewController *)uNC.topViewController; 
       aVC.popController = popSegue.popoverController; 
       aVC.delegate = self; 
      } 
     } 
    } 
} 

[self.delegate class]是在NSLogMyViewController负载上来为null。当然,在mainViewController中没有收到delegate回调。

本质上,我试图模仿苹果日历应用程序在iPad上的行为。

我试图使用代表传递数据上游按成语。诀窍是我试图通过作为popover的内容视图的UINavigationController来设置delegate。听起来太复杂了。也许还有另一个成语?

与此同时,我要给NSNotificationCenter一个旋风。

+0

奇怪的是,当我得到'null'这里:'[self.delegate类]'在MyViewController的viewDidLoad回调实际上得到触发。奇怪。 –

+0

我刚刚在MyViewController中创建了一个测试变量:'@property(nonatomic,strong)NSString * testString;'并试图在segue中设置它并在MyViewController的视图中加载打印出来。没有工作。我的猜测是MyViewController在segue时并不存在 - 即唯一存在的UINavigationController(即目标视图控制器)。嗯。 –

+0

亲切善良 - 如果我在调用委托协议之前将[self.delegate类](和testString)的NSLog打印输出从viewDidLoad移动到正确之前,那么它们的确可以正确打印出来,表明委托(和testString)确实在prepareForSegue中。有任何想法吗?在_after_ viewDidLoad之前@properties没有设置? –

回答

1

你有潜在的“如果”语句这不可能是真的:

if ([segue.identifier isEqualToString:@"popAlarmSegue"]) 
     { 
      if ([[segue destinationViewController] isKindOfClass:[UINavigationController class]]) 
      { 

从你的代码的样子,你应该得到的控制器在酥料饼的内容控制器里面钻,而不是目标的viewController从segue。看起来第二个'如果'不是真的。

您需要添加:

  if ([[popSegue.popoverController contentViewController] isKindOfClass:[UINavigationController class]]) 
      { 
       UINavigationController *uNC = (UINavigationController *)popSegue.popoverController; 
       MyViewController *aVC = (MyViewController *)uNC.topViewController; 
       aVC.popController = popSegue.popoverController; 
       aVC.delegate = self; 
      } 
+0

为什么这两个'if'陈述不成立?一个是谈论segue的标识符,另一个是谈论目标视图控制器的类?这是两件独立的事情。仅供参考,实际上,我不需要第二个,因为我知道它必须是UINavigationController,但我正在检查彻底性。 –

+0

我应该提到,如果我使用您的代码或我的代码,我会得到相同的结果。我看到使用'contentViewController'背后的逻辑,但由于某种原因,它没有改变任何东西。 –

+0

另外,如果你看看我对这个问题的评论,如果我等到viewDidLoad在NSLogging之前完成,我会得到预期的结果。 –