【问题标题】:Accessing properties of the root controller on a UINavigationController stack访问 UINavigationController 堆栈上的根控制器的属性
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 您说得对,我发布的示例确实表明它使用根控制器作为常量存储,您的回复是有道理的。然而,在实际代码中,数据是一个新轮询的 CLLocation,根拥有(和使用)以及其他视图也需要。我应该注意到这一点,但我主要关心的是找到正确的 Apple/Swifty 方式在控制器之间进行通信。似乎代表/协议是我需要的答案,也是我最终的结果。
  • 知道了,对于这种特殊情况,我看到人们在 CLLocationManager 之上构建单例包装器并将最近的 CLLocation 保存在属性中。然后你可以从任何控制器获取位置
【解决方案2】:

self.navigationController!.viewControllers

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

【讨论】:

  • 这正是我在示例中所做的。
猜你喜欢
  • 2011-09-23
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
相关资源
最近更新 更多