通过导航控制器时丢失指向委托的指针

Posted

技术标签:

【中文标题】通过导航控制器时丢失指向委托的指针【英文标题】:Lose pointer to Delegate while going through Navigation Controller 【发布时间】:2012-06-28 18:01:37 【问题描述】:

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

所以我一直在尝试学习如何使用委托和协议,但遇到了问题。我有一个协议:ButtonInPopOverWasPressed,只有一种方法:

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

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

   @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 获得实际视图?

我知道这是协议和委托的基础知识,但我环顾四周,似乎永远找不到适合我的答案。

【问题讨论】:

【参考方案1】:

试试下面的代码。

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

【讨论】:

哇哦!非常感谢!我已经为此工作了一段时间。我希望这将是一个简单的修复!【参考方案2】:

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

【讨论】:

以上是关于通过导航控制器时丢失指向委托的指针的主要内容,如果未能解决你的问题,请参考以下文章

如何通过导航控制器传递委托?

Swift - 通过导航控制器委托

在 prepareForSeque 时委托不是 nil,但在导航表视图中调用时为 nil

在导航控制器中实现滑出菜单时在哪里以及如何设置协议委托?

带有底部工具栏的 UI 导航控制器在视图切换时丢失 UIBarButtonItem

使用默认导航栏文本