呈现 UINavigationController 几个视图深度,作为初始视图

Posted

技术标签:

【中文标题】呈现 UINavigationController 几个视图深度,作为初始视图【英文标题】:Presenting UINavigationController several views deep, as initial view 【发布时间】:2011-01-09 17:14:46 【问题描述】:

在我的应用程序中,我希望有一个初始屏幕,允许用户注册(基于网络的)服务。完成此操作后,他们将自动登录。这些屏幕将显示为 UINavigationController 中的视图,例如:

1.Opening view > 2.Sign up view > 3.Logging in view > 4.Logged in view

一旦他们注册,下次启动应用程序时,应用程序应该直接进入视图 3(登录)。我如何将这种观点作为最初的观点提出? (另一个问题 - 如果用户决定退出,我将如何从视图 4 返回到视图 1?)

【问题讨论】:

【参考方案1】:

字面上的答案(“如何更改初始视图?”)将改变您的应用程序委托:

-(BOOL)application:(UIApplication *)application
       didFinishLaunchingWithOptions:(NSDictionary *)launchOptions     

    if ( newuser )
    
        [window addSubview:viewController1.view];
     else 
        [window addSubview:viewController2.view];
    

在您的 xib 文件中有两个 UINavigationControllers。但这可能会让人觉得有点不正统,并引发其他问题。否则,立即将整个视图控制器堆栈推送到其上,让视图控制器 1 和 2 立即推送下一个不带动画的控制器。

然后用户将只看到“登录视图”。如果您决定让用户从堆栈中弹出视图 4 和 3,则会出现视图控制器 2。

您可以通过调用 [self.navigationController popToRootViewControllerAnimated:NO] 之类的方法弹出整个堆栈

【讨论】:

你的意思是在前 2 个视图中有某种布尔值,如果是,它会立即在 viewDidLoad 方法中推送下一个视图? 是的,类似的东西。您还可以在 applicationDidFinishLaunching 中从您的应用程序委托推送它们,这样视图控制器就不会被太多的业务逻辑弄乱。有几种方法可以推送或设置视图控制器。 谢谢。在应用程序委托中向前推动几个屏幕的最佳方式是什么?目前我只有 [self.window addSubview:navigationController.view]; [self.window makeKeyAndVisible]; 我认为打电话给[navigationController setViewControllers:[NSArray arrayWithObjects:vc1,vc2,nil] animated:NO] 是最好的选择。 引用 apple.com UINavigationController docs: "讨论您可以使用此方法更新或替换当前视图控制器堆栈,而无需显式推送或弹出每个控制器。此外,此方法可以让您更新没有动画变化的控制器集这可能适合在启动时 当您想将导航控制器返回到以前的状态时。”天哪都在那儿……

以上是关于呈现 UINavigationController 几个视图深度,作为初始视图的主要内容,如果未能解决你的问题,请参考以下文章

如何正确关闭作为模式呈现的 UINavigationController?

UIViewController 呈现 UINavigationController - 没有导航栏?

从 UIViewController 呈现 UINavigationController 没有默认取消按钮

从 UINavigationController 堆栈视图呈现自定义 UIAlert

呈现模态后 UINavigationController 布局损坏

UINavigationController 按钮在模态呈现之前 layoutIfNeeded 时消失