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视图控制器,并显示正常的视图控制器,只要消除它像任何模态视图控制器