【问题标题】:Dynamic first View Controller in iOSiOS 中的动态第一个 View Controller
【发布时间】:2012-09-03 16:11:23
【问题描述】:

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

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

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

【问题讨论】:

  • 有几个问题在问这个问题,here's one,基本上你想每次都以同样的方式设置你的普通视图,但是如果你想让用户登录,你可以在上面显示一个模态视图控制器顶端。您在 appDidFinishLaunching 中执行此操作
  • 所以通过在 AppDidFinishLaunching 中执行此操作,我将避免在第一个视图控制器 (DidLoad...) 中执行此操作时发生的闪烁?
  • 我删除了我的答案。太复杂了,对你的设计有太多假设
  • @RM1970 我想是这样,但请确保您在没有动画的情况下呈现它,并在 makeKeyAndVisible 调用之后执行此操作

标签: ios


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 2015-07-31
      相关资源
      最近更新 更多