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

时间:2017-12-30 20:24:44

标签: swift xcode uinavigationcontroller

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

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

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

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

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

我使用Xcode 9和swift 4。

谢谢!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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