3

在理解如何选择第一个视图控制器以及如何动态更改它时,我遇到了一些鸡/蛋问题。

在典型的基于登录的应用程序(例如 facebook)中,您有第一个视图控制器,即登录。登录后,下次进入应用程序时会首先显示另一个视图。

我看不到一个地方(在 main.m 中?)或应用程序委托,您可以在其中选择第一个视图并应用一些逻辑来选择它。我所看到的是无论如何使用第一个视图,并且在该视图中完成了一些逻辑是否调用登录窗口。这是完成这项工作的唯一做法吗?我不希望我的主视图在生成登录视图之前闪烁片刻,以防用户需要登录。如果需要,我不能直接进入登录视图,或者如果用户已经登录,我不能先进入“登录”视图吗?

4

2 回答 2

2

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

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];

在此方法中,您还可以分配根导航控制器。所以你实际上可以结合这两种方法。

主要思想是让编排经理做好准备,以保持一切井井有条。

于 2012-09-10T20:21:36.837 回答
0

您可以通过多种方式执行此操作,但最简单的是保留用户是否需要登录的一些记录,如果需要,则在标准根视图控制器的顶部显示一个登录视图控制器作为模式视图控制器

- (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];
    }
}

当您想删除登录视图控制器并显示普通视图控制器时,只需像任何模态视图控制器一样将其关闭

于 2012-09-10T23:28:02.083 回答