我今天遇到过一种让我想知道最佳做法的情况。我非常感谢您对如何处理这个简化示例的任何评论:
假设我们有一个需要登录才有用的应用。因此,我们有几个视图和相应的视图控制器: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加载,然后它将加载适合的视图控制器。任何人都可以就这是否是更好的方法提供建议?如果是这样,怎么去呢?
在这样的情况下,你会推荐一种不同的方法吗?
谢谢,所有。
答案 0 :(得分:0)
一种方法是拥有一个代理的身份验证提供程序。在视图使用的模型类中,您可以设置身份验证提供程序。委托是一种协议,具有签名以进行身份验证并确定是否经过身份验证。
gui将为模型提供身份验证提供程序委托,该委托可以回答是否经过身份验证,如果不存在,则会提供模式视图控制器进行身份验证。不同的模型方法将确保通过身份验证(通过询问提供程序),如果没有,将在提供程序委托上调用authenticate。由于gui设置了auth提供程序,因此该模型不会破坏gui交互中的封装和烘焙。该模型只是调用一个回调。
这意味着您所处的视图和您所处的状态无关紧要。任何特定视图都会穿过模型,如果您未经过身份验证,则会收到提示。再举一个例子,假设auth令牌在一段时间后超时。如果在启动时将auth烘焙到一个特定视图中,您如何做到这一点?