【发布时间】:2017-08-22 15:12:21
【问题描述】:
当 UINavigationController 将视图控制器推送到视图中时,导航控制器会在后台创建自己的视图控制器实例。使用这个导航控制器委托:
extension Main_ProfileViewController: UINavigationControllerDelegate {
// called just after the navigation controller displays a view controller’s view and navigation item properties
open func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
print(viewController)
}
}
该实例可以是“确定的”。控制台打印如下内容:
<ElChapo.SomeRandomViewController: 0x7fbe8b003640>
每次导航控制器推送视图控制器时,14 个字符的哈希值都是不同的,因此很明显它们每次都是不同的实例。我的问题:该特定实例是否可以在不使用单例的情况下以某种方式访问?可访问性是指可访问性,我可以在其中运行委托并在该特定实例中调用特定方法。
这就是我想要完成的:
要将导航堆栈弹出回其根目录,我将从堆栈顶部的视图控制器中执行此函数。
// pop to root
func popToRoot() {
self.navigationController?.popToRootViewController(animated: true)
}
此方法必须从该视图控制器的特定实例中调用。如果我从另一个对象(例如选项卡栏)调用 popToRoot(),通过将委托传递给它,它不起作用,因为委托需要找到确切的实例来执行弹出。
【问题讨论】:
-
阅读这篇文章:stackoverflow.com/questions/5210535/… 这应该会给你很多信息。
-
您能解释一下为什么需要为视图控制器的特定实例调用委托吗?
UIViewController有一个生命周期。因此,您可以使用它来执行自定义操作。此外,如果您的模型没有改变,您可以在每次创建控制器的新实例时重新创建具有相同状态的控制器。这可以通过注入来实现。否则,您可以使用控制器协调器来实现您想要的,而无需使用单例。协调器是一种入口点,用于存储导航控制器将呈现的控制器。 -
正如@DonMag 所说,您的问题的答案是肯定的。如果您提供有关您尝试完成的确切功能的更多详细信息,我们可能会提供更多有用的答案。
-
这个问题是我上一个问题的一个分支:stackoverflow.com/questions/45808032/…
-
请在此处提供所有需要的信息。谢谢。
标签: ios swift uinavigationcontroller delegates singleton