访问 UINavigationController 堆栈上的根控制器的属性

Accessing properties of the root controller on a UINavigationController stack

我有一个带有根 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 中根视图控制器属性的正确方法吗?它在我的测试中确实有效,但是如果它有错误或缺点,或者是否有更好的方法,我想知道。

这是我所知道的在 UINavigationController 中访问根视图控制器的唯一方法。您询问了缺点,所以这是一个:

您可以使用 setViewControllers(_:, animated:) 即时更改导航控制器的视图控制器,因此假设根视图控制器始终为 HomeViewController[=15 可能不是一个好的长期策略=]

您似乎正在将导航控制器用作单例来存储和检索常量。除非 someString 依赖于导航控制器中的某些值,否则将其提取到某种 Constants 结构中会更易于维护。

self.navigationController!.viewControllers

这会将视图控制器数组添加到导航堆栈中,您可以遍历它并访问任何 ViewController 属性 来自它。