如何在 ViewController 之间传递委托
Posted
技术标签:
【中文标题】如何在 ViewController 之间传递委托【英文标题】:How to pass delegate between ViewControllers 【发布时间】:2015-07-14 06:50:32 【问题描述】:我有三个视图控制器。我们称它们为 BaseVC、firstVC 和 secondVC。 FirstVC 由 BaseVC 模态呈现。 SecondVC 由 firstVC 推送。每个 firstVC 和 secondVC 上都有一个按钮。通过单击它们,我想关闭当前的 VC 并让 BaseVC 做一些事情。所以我创建了一个协议,让 BaseVC 服从它,并将 BaseVC 设置为 firstVC 的委托。当我从 firstVC 设置 secondVC 的委托时,断点显示它成功。但是,当我从 secondVC 调用委托时,它显示 _delegate 为 nil。
是因为delegate 始终是weak
属性吗?那么如何在 View Controller 之间传递委托,或者有没有其他方法可以解决这个问题?
【问题讨论】:
"当我从 firstVC 设置 secondVC 的委托时..." 你能发布代码吗? Delegate 在不创建循环引用方面很弱。 BaseVC 位于 secondVC 和 thirdVC 之下,具有比这些推送 VC 更长的保证生命周期。 就在prepareforSegue
方法中,我设置了((secondVC *)destinationViewController).delegate = self.delegate
@ZeMoon
@LancelotdelaMare 因为当 secondVC 运行时,BaseVC 作为委托仍然可用。那么为什么我在 secondVC 的断点中看到 secondVC 的 delegate 是 nil,而在 firstVC 的断点中却看到它不是 nil~
很高兴回答这个问题。请在此处或 GitHub 上发布示例代码以供审核。
【参考方案1】:
您可以在关闭 VC 的同时使用 postNotification 并在 baseVC 上添加观察者来做一些操作。
您可以在按钮操作中使用[self.navigationController dismissViewControllerAnimated:YES completion:nil];
来关闭视图控制器。
在此之前,您需要发布通知[[NSNotificationCenter defaultCenter] postNotificationName:@"NotificaitonBaseVC" object:nil];
,并在baseVC的viewDidLoad方法中添加观察者,如下所示
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomeOperation:) name:@"NotificaitonBaseVC" object:nil];
【讨论】:
这确实有效。我选择这个作为我的最终解决方案。但我也想明白,为什么我不能在两个 VC 之间传递委托。 您可以在 2 个 VC 之间使用委托,但在这里您必须维护 3 个 VC 上的委托。所以我认为更好的解决方案是上述解决方案。另外我想知道你在上面的代码中遇到了什么问题? 我看到 secondVC 的委托在 secondVC 的断点中为 nil,而在 firstVC 的断点中看到它不是 nil。说明我没有成功传值~至于NSItificationCenter,我没遇到什么问题~以上是关于如何在 ViewController 之间传递委托的主要内容,如果未能解决你的问题,请参考以下文章
委托/协议不起作用:将数组从 TableViewController 传递给父 ViewController
如何在 PageViewController 和 ViewController 之间传递数据?
如何使用 StoryBoard 在 NavigationController 和 ViewController 之间传递值?
如何在 UIPageViewController 中的两个 ViewController 之间传递数据