【问题标题】:SWIFT 5 - navigation bar disappears after calling "show" method for changing storyboardSWIFT 5 - 调用“显示”方法更改情节提要后导航栏消失
【发布时间】:2020-12-01 03:44:22
【问题描述】:

我是 Swift 新手,我遇到了这个问题: 我加载主故事板,如果用户为零,那么我加载另一个带有其他场景的故事板。 为此,我运行以下代码:

override func viewDidAppear(_ animated: Bool) {
    if (true) {
        let loginScene = UIStoryboard(name: "NilUser", bundle: nil).instantiateViewController(withIdentifier: "loginScene") as! LoginController
        loginScene.modalPresentationStyle = .fullScreen
        show(loginScene, sender: nil)
    }
}

我知道 if 语句总是正确的,我现在想要它。 我还检查了登录场景是否是最初的场景,但即使这样,导航栏也不会显示自己。 问题是现在在登录场景中我看不到导航栏,我不明白为什么。 我能做些什么?如果您需要更多解释,我会给您。 谢谢!

【问题讨论】:

  • 您没有看到用于模态演示的导航栏,您需要推动控制器。
  • @TejaNandamuri 我像这样更改了我的代码:self.view.window?.rootViewController = loginScene 但问题仍然存在。我也试过这个:我也试过这个:self.navigationController?.pushViewController (loginScene, animated: true)

标签: ios swift storyboard uinavigationbar swift5


【解决方案1】:

据我所知

  1. 因此,您的主情节提要没有 NavigationController:
self.navigationController?.pushViewController(loginScene, animated:true)

自从 self.navigationController 之后就不能工作了?是零

  1. 我猜你的 NilUser Storyboard 似乎将 loginScene (UIViewController) 嵌入到 UINavigationController 中?!?并且您希望显示此 UINavigationController

通过调用

let loginScene = UIStoryboard(name: "NilUser", bundle: nil).instantiateViewController(withIdentifier: "loginScene") as! LoginController

您在没有 UINavigationController 的情况下直接实例化您的 LoginController,因此您应该将 UINavigationController 设为初始 ViewController 并尝试

let storyboard = UIStoryboard(name: "NilUser", bundle: nil)
guard let navigationController = storyboard.instantiateInitialViewController() else {
    // initial UINavigationController not found
    return
}
navigationController.modalPresentationStyle = .fullScreen
show(navigationController, sender: nil)

如果我错了,我可能错过了您的设置中的某些内容。

【讨论】:

  • 嗨@danielmarx 我刚刚检查过,你是对的,我的导航控制器为零......那么现在我该如何解决这个问题?如何以编程方式并遵循“Main”->“login”方案使 UINavigationController 成为初始视图控制器?
  • 这取决于你想要达到的目标。首先:您的 MainStoryboard 上是否有一个 UINavigationController 嵌入了您的“让我们称之为”MainViewController?如果不是,你应该添加一个,如果你想要一个。我猜您想检查用户是否已登录,如果不存在/推送 UserNil 故事板。您应该熟悉不同的演示风格。您可以在任何 UIViewController 上调用 present,但只能推送 UINavigationController。 show(...) 决定是推送还是展示。也许结帐这个链接:stackoverflow.com/a/25967267/4190135.
  • 确切地说:我有用户登录时的主情节提要,它是一个标签栏控制器,还有一个 SideMenu 控制器。现在我正在开发用户未登录的部分,我想我可以加载另一个故事板,所以我做到了。 NilUser 故事板有一个导航控制器来管理场景,但正如我告诉你的那样,导航栏没有出现。我是 swift 新手,我一直使用 Java for Android 编写代码,所以我想知道是否有一种方法可以让我加载另一个故事板,而不会继承或受前一个故事板的约束。
  • 正如我所说的,UIStoryboard(name: "NilUser", bundle: nil).instantiateViewController(withIdentifier: "loginScene") as! LoginController 将在没有 UINavigationController 的情况下从情节提要中实例化 LoginViewController。打开您的 UserNil 故事板并选择 UINavigationController。确保在属性检查器中选中“是初始视图控制器”。并使用storyboard.instantiateInitialViewController()对其进行初始化。然后用show(<your navigationController>, sender nil) 呈现它
  • 您也可以尝试let loginScene = UIStoryboard(name: "NilUser", bundle: nil).instantiateViewController(withIdentifier: "loginScene") as! LoginController; let nav = UINavigationController(rootViewController: loginScene); show(nav, sender: nil) 以编程方式创建 UINavigationController
【解决方案2】:

试试这个

让 loginScene = UIStoryboard(name: "NilUser", bundle: nil).instantiateViewController(withIdentifier: "loginScene") as!登录控制器

   self.navigationController?.pushViewController(loginScene, animated:true)

【讨论】:

  • 嗨@shanthkumar 我已经尝试过这个,并且可以确保我现在再次尝试,但它不起作用。当我使用 pushViewController 方法时,它保留在我调用该方法的场景中,所以这个甚至不加载登录场景
猜你喜欢
  • 2014-01-29
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多