Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 访问UINavigationController堆栈上根控制器的属性_Ios_Swift_Uinavigationcontroller - Fatal编程技术网

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

Ios 访问UINavigationController堆栈上根控制器的属性,ios,swift,uinavigationcontroller,Ios,Swift,Uinavigationcontroller,我有一个根为HomeViewController()的UINavigationController。HomeViewController有一个名为someString的属性。我想从另一个视图控制器访问以编程方式推送到导航堆栈上的someString: navigationController?.pushViewController(DetailViewController(), animated: true) 在想要访问某个字符串的DetailViewController中,我正在执行以下操作

我有一个根为HomeViewController()的
UINavigationController
。HomeViewController有一个名为someString的属性。我想从另一个视图控制器访问以编程方式推送到导航堆栈上的someString:

navigationController?.pushViewController(DetailViewController(), animated: true)
在想要访问某个字符串的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
中访问根视图控制器的唯一方法。您询问了缺点,这里有一个:

您可以使用
SetViewController(:,动画:)
动态更改导航控制器的视图控制器,因此假设根视图控制器始终是
HomeViewController


看起来您正在使用导航控制器作为单例来存储和检索常量。除非
someString
依赖于导航控制器中的某个值,否则将其提取到某种
常量
struct.

self.navigationController!。视图控制器

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

如果根控制器没有更改,这应该可以工作。避免强制展开(
)作为一种解决方法,这是可以的,但作为一种设计,它非常脆弱且“脏”(因为DetailViewController对MainViewController的依赖关系没有以任何方式表示;如果MainViewController不再是其navcontroller中的“第一个”,该怎么办?)。考虑将值传递给SEGUE中的详细控制器,或者使用委托模式(将HOMEVEVEWORD控制器传递给代表您需要的数据的协议委托)。这里有很多其他的想法:@KirilS。我最终接受了你的建议,并学会了用一个代理解决方案重写它。如果你想举个例子来回答,我会接受你的回答。否则我会写下来接受它。谢谢你说得对,我发布的示例确实建议使用根控制器作为常量存储,你的回答很有道理。但是,在实际代码中,数据是一个新轮询的CLLocation,root拥有(并使用)这个位置,其他视图也需要它。我应该注意到这一点,但我主要关心的是找到正确的Apple/Swift方式在控制器之间进行通信。似乎委托/协议是我需要的答案,也是我最终的结果。明白了,对于这种特殊情况,我看到人们在
CLLocationManager
上构建单例包装,并将最近的
CLLocation
保存在属性中。然后您可以从任何控制器获取位置,这正是我在示例中所做的。