使用根视图控制器确定要加载的视图

时间:2011-09-13 02:40:49

标签: iphone ios uiviewcontroller

我今天遇到过一种让我想知道最佳做法的情况。我非常感谢您对如何处理这个简化示例的任何评论:

假设我们有一个需要登录才有用的应用。因此,我们有几个视图和相应的视图控制器:LoginView和MainView。 MainView是导航控制器的根视图和根控制器。 LoginView是一个允许用户登录的视图。

因此,第一次启动应用程序时,应显示LoginView,然后在登录完成后显示MainView。在后续启动时,仅显示MainView。

一种方法是在applicationDidFinishLaunching中处理所有这些:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    UIViewController *rootController = [[MainView alloc] init];
    navigationController = [[UINavigationController alloc] initWithRootViewController:rootController];
    [self.window addSubview:navigationController.view];
    [self.window makeKeyAndVisible];

    if ( notLoggedIn ) {
        LoginView *vc = [[LoginView alloc] initWithNibName:@"LoginView" bundle:nil];
        [rootController presentModalViewController:vc animated:NO];
    }

    return YES;
}

能够在一个单独的专用“根”视图控制器中处理它会很好。该控制器将由AppDelegate加载,然后它将加载适合的视图控制器。任何人都可以就这是否是更好的方法提供建议?如果是这样,怎么去呢?

在这样的情况下,你会推荐一种不同的方法吗?

谢谢,所有。

1 个答案:

答案 0 :(得分:0)

一种方法是拥有一个代理的身份验证提供程序。在视图使用的模型类中,您可以设置身份验证提供程序。委托是一种协议,具有签名以进行身份​​验证并确定是否经过身份验证。

gui将为模型提供身份验证提供程序委托,该委托可以回答是否经过身份验证,如果不存在,则会提供模式视图控制器进行身份验证。不同的模型方法将确保通过身份验证(通过询问提供程序),如果没有,将在提供程序委托上调用authenticate。由于gui设置了auth提供程序,因此该模型不会破坏gui交互中的封装和烘焙。该模型只是调用一个回调。

这意味着您所处的视图和您所处的状态无关紧要。任何特定视图都会穿过模型,如果您未经过身份验证,则会收到提示。再举一个例子,假设auth令牌在一段时间后超时。如果在启动时将auth烘焙到一个特定视图中,您如何做到这一点?