iOS中的dynamic第一视图控制器

在理解如何select第一个视图控制器以及如何dynamic改变的时候,我有一个小小的鸡蛋/鸡蛋问题。

在一个典型的基于login的应用程序(例如脸书),你有第一个视图控制器是login。 login后,下一次进入应用程序时将首先查看另一个视图。

我看不到一个地方(在main.m中)或应用程序委托,您可以select第一个视图并应用一些逻辑来select它。 我所看到的是,无论如何都使用了第一个视图,并且在该视图中,不论是否调用login窗口,都会执行一些逻辑。 这是唯一的做法,做到这一点? 在用户需要login时,我不希望我的主视图闪烁一会儿才会产生login视图。 如果用户已经login,我不能直接进入login视图,如果需要的话,还是先login到“login”视图?

在应用程序委托中,您有应该是主应用程序窗口的窗口var:

self.window.rootViewController = anyViewController; [self.window makeKeyAndVisible]; 

你需要做的是决定什么是任何anyViewController的实例。 通常情况下,您通过显示启动图像来避免“闪烁”,直到通过根视图控制器显示关键窗口。 现在你可以做的是这样的:

的main.m

 int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class])); } } 

MyAppDelegate.m

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. UserInfo * appUserInfo = [[DataManager sharedManager] applicationUserInfo]; UIViewController *anyViewController = [[ControllersManager sharedManager] launchViewControllerForUser:userInfo]; self.window.rootViewController = anyViewController; [self.window makeKeyAndVisible]; return YES; } 

其中ControllersManager是您希望用于所有导航操作的单件控制器的pipe理器。 方法launchViewControllerForUser:可能是以下内容:

 -(UIViewController*) launchViewControllerForUser:(UserInfo*) aUserInfo { if (aUserInfo) { return [[MainMenuViewController new] autorelease]; } else { return [[LoginViewController new] autorelease]; } } 

DataManager是一个单例类,您将用于所有数据操作,例如读取先前保存在UserInfo对象中的应用程序用户。


有时你的主窗口有一个nib文件,如果你想使用这种技术,你需要自定义这一行

  self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 

具有相同的模式:

  self.window = [[WindowManager sharedManager] keyLaunchApplicationWindow]; 

而在这个方法里面,你也可以分配根目录导航控制器。 所以你可以把这两种方法结合起来

主要的想法是准备好pipe理人员,把所有事情都组织起来。

您可以通过多种方式来完成此操作,但最简单的方法是logging用户需要login的logging,如果存在,则将login视图控制器显示为标准根视图控制器顶部的模式视图控制器

 - (void)appDidFinishLaunchingWithOptions:(NSDictionary *)options { //window setup UIViewController *normalRootViewController = [[UIViewController alloc] init]; self.window.rootViewController = normalRootViewController; [self.window makeKeyAndVisible]; if (shouldDisplayLoginViewController) { UIViewController *loginViewController = [[UIViewController alloc] init]; [self.window.rootViewController presentModalViewController:loginViewController animated:NO]; } } 

当你想删除login视图控制器,并显示正常的视图控制器,只要消除它像任何模态视图控制器