performSegue() 用于显示(推送)两个 UIViewController 中的任何一个,但其中一个具有 nil navigationController

问题描述 投票:0回答:1

我有一个位于导航堆栈中的 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,这是唯一一个存在此问题的。我看不出我对这个做了什么不同的事情。

我错过了什么?我在这里做错了什么?

swift uinavigationcontroller segue
1个回答
0
投票

解决了!这非常晦涩(至少对我来说!):

如问题中的

prepare()
函数所示,设置了以下属性:
geometryController.feature = feature

此属性在

didSet{}
(segue 的目的地)中有一个
FeatureGeometryController
块,其中包括以下行:
tableView.tableHeaderView = someUILabel

看来这段代码放在这个

didSet{}
块中一定是错误的,我不知道为什么。此时视图似乎已加载正常(因为这确实有效......标签确实很好地显示为表视图的标题。)

无论如何,解决方案是将这条线移出

didSet{}
块并移入
viewDidLoad()
函数。

我不清楚为什么它会导致这种特殊的不良行为。如果有人有的话,我会对解释感兴趣。

© www.soinside.com 2019 - 2024. All rights reserved.