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

Posted

技术标签:

【中文标题】导航控制器到不是初始视图控制器的视图控制器【英文标题】:Navigation controller to view controller that is not initial view controller 【发布时间】:2017-12-30 20:24:44 【问题描述】:

是否可以将导航控制器和标签栏添加到不是初始视图控制器的视图控制器?

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

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

当登录成功时,我使用这个代码:

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

我使用 Xcode 9 和 swift 4。

谢谢!

【问题讨论】:

目前你有(withIdentifier: “mainView),你是说(withIdentifier: "mainView")吗? 那是错字,在代码中是“mainView”。 【参考方案1】:

我想你可能看错了。始终将登录视图作为视图层次结构中的根控制器,即使在不需要时也是如此。 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 美元。

【讨论】:

【参考方案2】:

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

【讨论】:

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

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

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

如何将导航控制器添加到不是主视图的视图?

从导航控制器导航到普通视图控制器

如果我在 Storyboard 中有一个容器视图,是不是可以只将一个视图控制器嵌入到导航控制器中?

弹出到初始视图控制器