【发布时间】:2021-04-09 18:27:02
【问题描述】:
我有一个带有根 HomeViewController() 的 UINavigationController。 HomeViewController 有一个名为 someString 的属性。我想从另一个以编程方式推送到导航堆栈的视图控制器访问 someString:
navigationController?.pushViewController(DetailViewController(), animated: true)
在想要访问 someString 的 DetailViewController 中,我正在这样做:
var homeViewController: HomeViewController!
override func viewDidLoad() {
super.viewDidLoad()
let navController = self.navigationController!
homeViewController = navController.viewControllers.first as? HomeViewController
}
然后从 DetailViewController 中获取 someString 的值:
var stringFromRoot = homeViewController.someString
这是在 UINavigationController 中访问根视图控制器属性的正确方法吗?它在我的测试中确实有效,但如果它有错误或缺点,或者是否有更好的方法,我想知道。
【问题讨论】:
-
如果根控制器没有改变,这应该可以。不过要避免强制展开 (
!) -
作为一种解决方法是可以的,但作为一种设计,它非常脆弱和“肮脏”(因为 DetailViewController 对 MainViewController 的依赖没有以任何方式表达;如果 MainViewController 不再是“第一”怎么办在其导航控制器中?)。考虑将值传递给 segue 中的详细控制器,或使用委托模式(将 HomeViewCOntroller 作为代表您需要的数据的协议委托传递给 Detail)。在这里查看很多其他想法:stackoverflow.com/questions/5210535/…
-
@KirilS。我最终接受了你的建议,并学会了用委托解决方案重写它。如果你想用一个例子来回答,我会接受你的回答。否则我会写下来并接受它。谢谢!
标签: ios swift uinavigationcontroller