3

我知道这个问题有点开放,但我试图让它尽可能具体,因为我真的不知道 iOS 的这种类型的事情的标准约定是什么。我一直在考虑在我的应用程序上实现登录屏幕,但是我无法找出最佳方法。我在下面列出了三种方法,有人可以告诉我其中一种方法更好或更正确吗?(或者如果有什么我完全错过了)。

第一种方法 - 我最初有一个导航控制器作为我的根控制器,登录屏幕是堆栈上的第一个视图。然后当用户登录时,我只是将主 UI 推送到堆栈。然后,用户可以使用后退按钮返回登录屏幕。我知道这种技术有效,但是当重新启动应用程序时,用户不需要再次登录。我不确定我是否应该以相同的方式设置堆栈(首先登录页面)然后将主 UI 推到顶部?这是一种常见的技术吗?

下一种方法,我在这里找到了如何替换根控制器如何从 CustomViewController 中更改 RootViewController(在 AppDelegate 中)?我更喜欢这个想法,我可以在登录后摆脱登录屏幕并添加某种类型的按钮以使其在注销时重新出现。然后在重新启动期间,我可以完全跳过添加登录屏幕。

第三种方法可能是在主 UI 之上覆盖登录,但我还没有找到任何代码来执行此操作。这似乎也有点奇怪,因为我的主 UI 可能会开始触发我不希望在登录后发生的消息,所以我必须考虑到这一点。

4

4 回答 4

3

我建议你有一个带有空白视图的根视图控制器。此控制器在 AppDelegate 的 applicationDidFinishLaunching: 方法中设置为根视图控制器。

这个根视图控制器的作用是最初通过登录视图控制器显示登录屏幕。登录视图控制器在成功登录后委托给根视图控制器以从根视图和根视图控制器中删除自己,然后设置要显示的下一个控制器。

这样,您可以在通过根视图控制器显示主视图之前管理多个视图(如果有的话)。

在根视图之上显示登录视图有多种方式。

1)呈现一个没有动画的登录视图控制器。

2) 在根视图之上添加登录视图作为子视图 [注意:在 iOS 5 之前,您不会获得旋转和视图生命周期回调,您应该编写自己的代码将回调传递给顶部添加的视图的根视图。从 iOS 5 开始,您可以使用视图包含概念来维护父子关系。]

希望这可以帮助。

于 2013-04-02T17:49:06.290 回答
2

我们有一个类似的应用程序。我们的故事板看起来有点像一个轮子。

我们有一个导航控制器作为我们的根控制器,然后它转到一个带有微调器的视图控制器。该控制器处理调用以查看用户是否已登录。它连接到两个不同的控制器。

如果他们已经登录,它会转到主视图控制器。如果他们还没有登录,它会转到登录视图控制器。登录视图控制器将在成功时返回初始视图控制器,并且由于它们随后将被登录,它会转到主控制器。

为了回退,我们一直回到带有微调器的初始视图控制器。

您可以在主视图之前隐藏每个视图上的导航栏。

于 2013-04-02T17:40:59.627 回答
2

我们所有的 ViewController 都是从 uiviewcontroller 的自定义子类继承而来的。这使我们能够对行为、约束、......

如果用户未登录,我们的超级视图控制器类通过在 viewWillAppear 上调用模态视图来处理身份验证。它的作用就像处理断开连接和从应用程序中的任何点恢复一样的魅力。

于 2014-07-25T18:13:52.650 回答
2

我总是用故事板来实现它。只需将Storyboard ID添加到您的登录视图控制器,例如Onboarding

然后在里面写这样的东西application: didFinishLaunchingWithOptions:

if (![[NSUserDefaults standardUserDefaults] objectForKey:TRAIN_COMPLETE]) {
    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"Onboarding"];
}
于 2014-10-14T12:11:06.523 回答