我有一个位于导航堆栈中的 UIViewController。可以使用以下方法从此 UIViewController 触发两种不同的 Segue:
performSegue(withIdentifier: "SomeIdentifier", sender: self)
有两个不同的标识符可以将 UIViewController 的两个不同子类中的任何一个显示(推送)到导航堆栈上。
在这两种情况下,显示的(推送的)视图控制器都显示正确并且大部分功能正常,除了在一种情况下视图控制器具有
nil
navigationController
。当然,这会阻止多个功能可用(例如,我无法从此视图控制器控制标准导航控制器工具栏)。
据我所知,我在两个 segues 和两个 UIViewController 子类中都做了同样的事情(以各种相关的方式)。这两个segues 都在Storyboad 中配置为“Show(例如,Push)”segues。它们都有由 PerformSegue() 调用的标识符(这显然可以工作,因为它们加载了正确的视图控制器)。它们都在
prepare(for segue: UIStoryboardSegue, sender: Any?)
函数中使用类似的代码。相关代码如下。
@objc func handleButtonAction() {
// performSegue(withIdentifier: "Profile Chart", sender: self)
performSegue(withIdentifier: "Feature Geometry", sender: self)
}
注释掉其中一行
performSegue()
行并取消注释另一行以尝试其他转场:
@objc func handleButtonAction() {
performSegue(withIdentifier: "Profile Chart", sender: self)
// performSegue(withIdentifier: "Feature Geometry", sender: self)
}
准备segue(对于两个segue中的任何一个):
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let geometryController = segue.destination as? FeatureGeometryController {
geometryController.feature = feature
} else if let profileController = segue.destination as? ProfileChartController {
profileController.feature = feature
}
}
在
ProfileChartController
,一切都很好。在 FeatureGeometryController
中,大多数事情都运行良好。 feature
已正确分配,并且其数据显示正确。但它的 navigationController
为零(如下所示),因此有些功能我无法访问(包括管理标准工具栏,以及调用导航控制器的根视图控制器)。
在
FeatureGeometryController
中,下面viewDidLoad()
中的打印语句显示navigationController: nil
。
override func viewDidLoad() {
super.viewDidLoad()
print("navigationController: \(String(describing: navigationController))")
在此导航堆栈中,我实际上有数十个与数十个自定义 UIViewController 子类之间的类似 Segue,这是唯一一个存在此问题的。我看不出我对这个做了什么不同的事情。
我错过了什么?我在这里做错了什么?
解决了!这非常晦涩(至少对我来说!):
如问题中的
prepare()
函数所示,设置了以下属性:geometryController.feature = feature
。
此属性在
didSet{}
(segue 的目的地)中有一个 FeatureGeometryController
块,其中包括以下行:tableView.tableHeaderView = someUILabel
看来这段代码放在这个
didSet{}
块中一定是错误的,我不知道为什么。此时视图似乎已加载正常(因为这确实有效......标签确实很好地显示为表视图的标题。)
无论如何,解决方案是将这条线移出
didSet{}
块并移入 viewDidLoad()
函数。
我不清楚为什么它会导致这种特殊的不良行为。如果有人有的话,我会对解释感兴趣。