在应用程序委托中,您有一个应该是主应用程序窗口的窗口变量:
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 是一个单例控制器的管理器,您希望将其用于所有导航操作。方法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];
在此方法中,您还可以分配根导航控制器。所以你实际上可以结合这两种方法。
主要思想是让编排经理做好准备,让一切井井有条。