在浏览导航控制器时丢失指向Delegate的指针

时间:2012-06-28 18:01:38

标签: ios delegates uinavigationcontroller segue popover

我不完全确定如何解释我的问题,但我会尝试。

所以我一直在努力学习如何使用委托和协议并遇到问题。我有一个协议:ButtonInPopOverWasPressed,有一个方法:

   - (void)buttonWasPressed:(NSString *)buttonValue;

我还有一个主视图控制器和一个带有属性的自定义popover类:

   @property (retain, nonatomic) id <ButtonInPopoverWasPressed> delegate;

在我的主视图控制器中,我有一个按钮和一个文本标签。按下按钮时,它会转到正常的弹出窗口。然后我将segue.destinationViewController的委托指定为主视图控制器,如下所示:

   [segue.destinationViewController setDelegate:self];    

然后当选择弹出框中的按钮时,它会通过调用主视图侦听的协议方法显示在主视图的文本标签中:

   [self.delegate buttonWasPressed:sender.currentTitle]; // sends the title of the button pressed to the delegate

一切正常。当我想按下按钮时将弹出窗口转换到不同的视图而不是将信息发送回主视图时,我的问题就出现了。但是当我创建一个导航控制器作为弹出窗口并将关系设置为旧的弹出窗口时,一切都破了。

当我分配segue的委托时(如上所示),它在另一侧出现为null,所以我完全失去了将其传递给其他子视图并将信息返回主视图的能力。导航控制器是否会吸引代表?如何让代表通过NC获取实际视图?

我知道这是协议和代表的基础知识,但我环顾四周,似乎永远无法找到对我有用的答案。

2 个答案:

答案 0 :(得分:3)

请尝试以下代码。

    NSArray *temp = [[segue destinationViewController] childViewControllers];
    PopoverViewController *popoverViewController = (PopoverViewController)[temp objectAtIndex:0];
    popoverViewController.delegate = self;

答案 1 :(得分:0)

在主视图中创建一个委托方法,而不是使用导航控制器,该方法打开不同的弹出框并关闭现有的弹出框。你会得到相同的结果,但没有在弹出窗口中安装导航控制器的可疑想法。