导航控制器查看非初始视图控制器的控制器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了导航控制器查看非初始视图控制器的控制器相关的知识,希望对你有一定的参考价值。

是否可以添加导航控制器和标签栏来查看非初始视图控制器的控制器?

我的“初始视图控制器”是登录屏幕。不需要导航控制器和标签栏。

当我从“编辑器 - >嵌入 - > ...”中添加导航控制器和标签栏时,它们不会出现

登录成功后,我使用此代码:

if let viewController = self.storyboard?.instantiateViewController(withIdentifier: "mainView") {
    UIApplication.shared.keyWindow?.rootViewController = viewController
    self.dismiss(animated: true, completion: nil)
}

我使用Xcode 9和swift 4。

谢谢!

答案

我想你可能会看错了。始终将登录视图作为视图层次结构中的根控制器,即使不需要也是不好的做法。并且LoginController不应该拥有MainController,但MainController应该拥有LoginController。您应该使用根视图创建主视图(使用导航控制器/选项卡控制器),然后在viewWillAppear方法中检查用户是否经过身份验证;如果用户未经过身份验证,则以模态方式推送登录控制器。这样你的视图层次结构就不那么复杂了。

你可以有一个提供者类CurrentUser

class CurrentUser {
  var user: User? {
    guard let userData = UserDefaults.standard.object(forKey: "user") as? Data,
      let user = NSKeyedUnarchiver.unarchiveObject(with: userData) as? User else {
        return nil
    }
    return user
  }

  static let shared = CurrentUser()
}

MainController.viewWillAppear

override func viewWillAppear() {
  super.viewWillAppear()
  guard let user = CurrentUser.shared.user else {
    pushViewController(LoginController(), animated: true)
  }

  // do additional setup
}

只需我0.02美元。

另一答案

只是回答你的问题,不仅可能,而且很常见。您可以将导航控制器放在任何位置。导航控制器所做的全部工作是为视图控制器的进展创建一个起点,通过保持视图控制器的历史记录保持活动并按顺序进行操作。因此,如果您的应用程序具有3个不同的部分,您可能很可能希望在每个部分中放置导航控制器,以便用户能够独立地深入到每个部分。

以上是关于导航控制器查看非初始视图控制器的控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用给定的根视图控制器和初始视图控制器实例化情节提要?

导航控制器到不是初始视图控制器的视图控制器

呈现一个导航栏和一个非根视图标签栏控制器

“是初始视图控制器”复选框发生了啥?

弹出到初始视图控制器

设置导航控制器的初始视图控制器