【问题标题】:Using a root view controller to determine which view to load使用根视图控制器来确定要加载的视图
【发布时间】:2011-09-13 02:40:48
【问题描述】:

我今天遇到了一个让我想知道最佳实践的情况。对于您将如何处理这个简化的示例,我将不胜感激:

假设我们有一个需要登录才能使用的应用。所以,我们有几个视图和相应的视图控制器: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 加载,然后它会加载合适的视图控制器。有人可以就这是否是更好的方法提供建议吗?如果是这样,该怎么做?

在这种情况下,您会推荐其他方法吗?

谢谢大家。

【问题讨论】:

    标签: iphone ios uiviewcontroller


    【解决方案1】:

    一种方法是拥有一个作为委托的身份验证提供程序。在您的视图使用的模型类中,您可以设置身份验证提供程序。委托是一个协议,它有一个签名来验证和确定是否通过了验证。

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

    这意味着您在哪个视图上以及您处于什么状态都没有关系。因为任何特定的视图都穿过模型,如果您未通过身份验证,您将收到提示。作为另一个示例,假设身份验证令牌在一段时间后超时。如果 auth 在启动时被纳入一个特定的视图,你将如何做到这一点?

    【讨论】:

    • 非常感谢,布赖恩马克!我喜欢这是要去的地方。请检查我的理解。我添加了一个类:AuthProvider。然后 MainView 控制器设置 Model.authDelegate = AuthProvider。每当该控制器尝试访问受限数据时,模型都会调用 AuthProvider 的函数来确定用户当前是否已通过身份验证。如果不是,则模型让 AuthProvider 呈现登录提示。但是如果 AuthProvider 要呈现一个模态视图控制器,它需要一个对 MainView 控制器的引用。初始化 AuthProvider 时是否从 MainView 传递它?
    猜你喜欢
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多