Ios 将导航控制器限制为一组UIViewController

Ios 将导航控制器限制为一组UIViewController,ios,uiviewcontroller,storyboard,Ios,Uiviewcontroller,Storyboard,是否可以将NavigationController限制为某一组UIViewController。如图所示,我需要导航控制器,但仅用于登录/创建用户会话。一旦登录,我显然不希望用户能够返回(除了注销)。我怎样才能做到这一点?我想不出来。您可以在需要时更改导航控制器的堆栈,例如: func logIn() { //Delete all presented view controllers up to a point navigationController.setViewControll


是否可以将NavigationController限制为某一组UIViewController。如图所示,我需要导航控制器,但仅用于登录/创建用户会话。一旦登录,我显然不希望用户能够返回(除了注销)。我怎样才能做到这一点?我想不出来。

您可以在需要时更改导航控制器的堆栈,例如:

func logIn() {
   //Delete all presented view controllers up to a point
   navigationController.setViewControllers([], animated: false)

   //Create new view controller
   let viewController = ....
   navigationController.pushViewController(viewController, animated: true)
}
看一看,这可能会给你一些想法


如果您想将以前的视图控制器保留在堆栈中,而只是禁止用户弹出到它们,那么它可能是子类UINavigationController并重写
func-popViewController(动画:Bool)->UIViewController?

的最佳解决方案,您可以在需要时更改导航控制器的堆栈,例如:

func logIn() {
   //Delete all presented view controllers up to a point
   navigationController.setViewControllers([], animated: false)

   //Create new view controller
   let viewController = ....
   navigationController.pushViewController(viewController, animated: true)
}
看一看,这可能会给你一些想法


如果您想将以前的视图控制器保留在堆栈中,而只是禁止用户弹出它们,那么它可能是子类UINavigationController并覆盖
func-popViewController(动画:Bool)->UIViewController?

转到情节提要->选择导航控制器->属性检查器->取消选中的最佳解决方案“显示导航栏”属性

然后选择登录/注册和TabBarController之间的关系,并将其删除

登录后,您可以将TabBarController(或任何相关控制器)设置为rootViewController。当应用程序启动时,您可以在
AppDelegate.swift
文件中检查它,如下所示:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    FirebaseApp.configure()

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    if Auth.auth().currentUser != nil {

        let tabBarController = storyboard.instantiateViewController(withIdentifier: "tabBarcontroller") as! TabBarController
        self.window?.rootViewController = tabBarController
        self.window?.makeKeyAndVisible()
    }
    else
    {
        let loginNavController = storyboard.instantiateViewController(withIdentifier: "LoginNavController") as! UINavigationController
        self.window?.rootViewController = loginNavController
        self.window?.makeKeyAndVisible()
    }
    return true
}

转到情节提要->选择导航控制器->属性检查器->取消选中“显示导航栏”属性

然后选择登录/注册和TabBarController之间的关系,并将其删除

登录后,您可以将TabBarController(或任何相关控制器)设置为rootViewController。当应用程序启动时,您可以在
AppDelegate.swift
文件中检查它,如下所示:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    FirebaseApp.configure()

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    if Auth.auth().currentUser != nil {

        let tabBarController = storyboard.instantiateViewController(withIdentifier: "tabBarcontroller") as! TabBarController
        self.window?.rootViewController = tabBarController
        self.window?.makeKeyAndVisible()
    }
    else
    {
        let loginNavController = storyboard.instantiateViewController(withIdentifier: "LoginNavController") as! UINavigationController
        self.window?.rootViewController = loginNavController
        self.window?.makeKeyAndVisible()
    }
    return true
}

为什么不在实际的根视图控制器上显示您的登录控制器?为什么不在实际的根视图控制器上显示您的登录控制器?不需要删除控制器,您可以直接调用
navigationController.SetViewController([viewController],动画:true)
。我现在所做的就是将“显示”设置为“以模态方式呈现”。这将从导航控制器中解除其余控制器的绑定!无需删除控制器,您只需直接调用
navigationController.SetViewController([viewController],动画:true)
。我现在所做的就是将“Show”设置为“以模态方式呈现”“。这将解除其余控制器与导航控制器的绑定!