在应用程序委托中,您有应该是主应用程序窗口的窗口变量:
self.window.rootViewController = anyViewController;
[self.window makeKeyAndVisible];
你需要做的是决定什么是anyViewController
. 通常,您通过呈现启动图像来避免“闪烁”,它会一直显示,直到关键窗口通过它的根视图控制器可见为止。现在你可以做的是:
主文件
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
您希望将其用于所有导航操作的单例控制器管理器在哪里。该方法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];
在此方法中,您还可以分配根导航控制器。所以你实际上可以结合这两种方法。
主要思想是让编排经理做好准备,以保持一切井井有条。