2011-04-19 70 views
0

在我之前的question on UIView animations中,我提到我必须模拟某种视图的模态行为。在这里,我将解释为什么并询问一些更好的解决方案。在应用程序启动时提供登录屏幕

用户应该在我的应用程序中看到的第一个视图是登录屏幕。在成功认证后,程序检查用户是父母还是孩子(在家庭中)。对于这些角色中的每一个,应用都必须提供不同的功能在我的AppDelegate

  • 的登录视图控制器申报网点和标签栏控制器(该接口的主要部分):

    所以我设计了这样的应用程序。

  • application:didFinishLaunchingWithOptions:方法
    • 将主窗口到登录视图控制器的rootViewController
    • 使AppDelegate登录控制器的委托,以便它可以在完成其工作时发送通知。
  • 当AppDelegate中接收关于成功登录的消息时,它确定用户是否是父或子,实例化的一组提供相应的功能视图控制器,并将它们传递到标签栏控制器。
  • 最后,AppDelegate将主窗口的rootViewController切换到标签栏控制器。
  • 当然用户可以注销,然后rootViewController再次切换回登录控制器。

我想提出并关闭登录屏幕,就好像它是模态的视图,但只的AppDelegate具有裸窗口,因而我没有一个对象发送到presentModalViewController:。这带来了一个问题:

首先,它是一个很好的设计?
如果是这样,我该如何正确模拟模态行为?

回答

0

我认为你是在正确的轨道上。然而,我总是尽力摆脱应用程序委托,只留下应用程序级别的东西(例如响应通知,进出背景)。在这种情况下,这样做会对你有所帮助。

在appDelegate中,创建一个新的UIViewController类,类似“startUpController”。 将它的视图添加到应用程序窗口。 然后,在您的startUpController中,执行您在应用程序委托(登录,选项卡栏设置等)中执行的所有操作。 现在,由于您处于视图控制器中,您可以将ModalViewController呈现给您的内容。

+0

1。总的来说,我同意你答案的第一部分。您已经描述了应用程序委托的用途。但是,当应用程序代理被用于其他目的时(例如,如果您希望成为应用程序控制器),有一些例外情况。将其堆栈放入应用程序委托的Core Data模板。另一方面,视图控制器应该控制其视图。 'startUpController'的视图不过是一个虚拟。因此,我们将在另一个容器视图(窗口)中拥有一个“纯容器”视图。这违反了Occam的剃刀原理。 – adubr 2011-04-19 23:16:06

+0

好吧,许多苹果的示例项目都将逻辑放在了应用程序委托中,但这并没有做到正确。如果您已经构建了任何核心数据应用程序,那么您无疑会发现它在应用程序委托中的尴尬程度。 2.随意分解额外的视图(或用剃刀分开);既然你在问如何模拟一个模态对话框,我得出结论说你并不了解所有的观点,并给了你一个简单的解决方案。 – Rayfleck 2011-04-19 23:50:51

+0

不幸的是我不太了解视图,所以我试图逻辑推理。这样想:如果你没有任何登录屏幕和不同的角色,你会创建一个视图控制器来设置主选项卡栏控制器吗? – adubr 2011-04-21 09:11:25

相关问题