使用后如何在堆栈中删除 UINavigationController 的第一个视图?

Posted

技术标签:

【中文标题】使用后如何在堆栈中删除 UINavigationController 的第一个视图?【英文标题】:How to remove UINavigationController first view in stack after used? 【发布时间】:2011-03-29 07:28:27 【问题描述】:

我有一个UINavigationController,它有一个登录视图,一旦加载应用就会出现。

一旦用户点击登录,我们将下一个视图压入堆栈并出现。我希望用户无法返回loginview

加载下一个视图后如何从堆栈中删除登录视图?

注意:要求应用的唯一容器是UINavigationController

【问题讨论】:

【参考方案1】:

您可以使用 setViewControllers:animated: 来修改控制器堆栈,但我建议您重新考虑是否真的希望您的登录视图控制器成为导航堆栈的根。当用户看到导航控制器时,他们期望在以树状结构组织的屏幕层次结构中上下导航。改变那棵树的根在某种程度上破坏了这个比喻。

考虑使用模态展示来传达登录体验不属于您应用的主要分层导航结构这一事实。这里有几个选项:

A.从登录视图控制器开始,并以模态方式呈现导航控制器。

如果您的登录视图控制器始终是用户看到的第一个屏幕,您可以将其视图直接添加到窗口,而无需导航控制器。然后,一旦用户登录,创建导航控制器并通过从您的登录视图控制器调用 presentModalViewController:animated: 来呈现它。

B.使用其真正的根初始化导航控制器,并以模态方式呈现登录视图控制器。

如果登录提示并不总是用户看到的第一个视图,特别是如果登录提示可以在其他上下文中弹出,则此选项可能值得考虑。例如,我在一个允许用户离线或匿名访问某些部分的应用程序中使用了这种方法。当用户尝试访问需要身份验证的内容时,登录提示会以模态方式呈现。

【讨论】:

【参考方案2】:

通过将登录控制器的 navigationItem 上的 backButtonItem 设置为 nil 来删除后退按钮。

【讨论】:

【参考方案3】:

在上述情况下,您的登录视图控制器将被称为 UINavigationController 的根控制器

阅读下文如何删除 UINavigationController 的根控制器

http://starterstep.wordpress.com/2009/03/05/changing-a-uinavigationcontroller%E2%80%99s-root-view-controller/

【讨论】:

【参考方案4】:

我发现只要设置 ViewControllers 属性就可以了。

(我们使用 C# 和 .NET 使用 MonoTouch 构建 iPhone 应用程序)

public override void ViewDidAppear (bool animated)

   NavigationController.ViewControllers = new UIViewController[]  this ;

【讨论】:

【参考方案5】:

使用 NSUserdefault 设置 bool 检查值以验证是否显示登录页面或下一页

例如,在登录页面时,您将获取用户名密码,然后将其发送到服务器,您将收到成功或失败的结果

如果成功则将 NSuserdefault 中的 Bool 设置为 yes

登录成功后推送nextview。

如果下次用户来你的应用程序,你必须先检查 NSuserdefault 的布尔值

据此你可以推送下一个视图控制器或登录页面。

就是这样。

在 nsuserdefault 中你可以为 key 指定字符串而不是 bool

成功登录后 将 isLogined 设置为是

NSUserDefaults *std = [NSUserDefaults standardUserDefaults];

[std setObject:@"yes" forKey:@"isLogined"];

如果不设置否

在推送登录页面之前,只需验证 isLogined 是或否

据此你可以推送登录页面或下一页

验证

[std stringforkey:@"isLogined"];

【讨论】:

以上是关于使用后如何在堆栈中删除 UINavigationController 的第一个视图?的主要内容,如果未能解决你的问题,请参考以下文章

从 Tispr 卡片堆栈中删除卡片

如何从演示堆栈中删除中间 UIViewController

如何在UITableViewCell - Swift 3中删除标签后仍然保持约束

如何从模态堆栈优化方式(特定)中删除页面?

如何在颤动中推动替换删除整个导航堆栈?

如何删除具有 O(1) 额外内存的二叉树?