【问题标题】:Why can't I launch this modal view from didFinishLaunchingWithOptions?为什么我不能从 didFinishLaunchingWithOptions 启动这个模式视图?
【发布时间】:2011-07-20 03:07:59
【问题描述】:

据我估计,我正在尝试做一些非常简单的事情:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    prefs =  [NSUserDefaults standardUserDefaults];
    BOOL IsLoggedIn = [prefs boolForKey:@"IsLoggedIn"];

    if(IsLoggedIn == NO)
    {
        //Show login controller
        LoginViewController *lvc = [[LoginViewController alloc] initWithNibName:nil bundle:nil];
        [self.tabBarController presentModalViewController:lvc animated:NO];
        [lvc release];
    }
    else if(IsLoggedIn == YES)
    {
        //Continue doing crap
    }

    // Override point for customization after application launch.
    // Add the tab bar controller's current view as a subview of the window
    self.window.rootViewController = self.tabBarController;

    NSArray *tabs =  self.tabBarController.viewControllers;
    UIViewController *tbInvoice = [tabs objectAtIndex:0];
    tbInvoice.tabBarItem.image = [UIImage imageNamed:@"Open-Mail.png"];
    UIViewController *tbClient = [tabs objectAtIndex:1];
    tbClient.tabBarItem.image = [UIImage imageNamed:@"Breifcase.png"];

    [self.window makeKeyAndVisible];
    return YES;
}

使用调试器时,我看到它输入if(IsLoggedIn == NO) 并运行LoginViewController 代码,但视图从未显示。

这让我发疯了。

我尝试在[self.windoow makeKeyAndVisible] 之后运行代码,但没有任何改变。

这段代码看起来像我见过的每个例子。谁能看到我做错了什么?

提前致谢,

悬崖

【问题讨论】:

  • 你在哪里初始化你的 tabBarController?
  • LoginViewController 如何加载它的视图?您将 nil 传递给 nib 名称,因此您必须覆盖 loadView 才能以编程方式加载视图才能使其正常工作。如果是这样,您是否在loadView 中调用setView:(或者如果使用点语法,则调用self.view = whatever)?
  • @jlehr 如果您使用 nil 作为 nib 名称,它将首先尝试使用与类名称相同的 nib。不过似乎还是指定它会更好
  • 我最初指定了笔尖名称和捆绑包,所以我知道这不是问题所在。由于我找到了一些代码示例,我一时兴起对其进行了更改。
  • 我不确定你在哪里初始化它是什么意思?这个 sn-p 来自 AppDelegate 并且是基于选项卡的视图项目的默认配置的一部分。 (我对 Objective-C/iPhone 开发还很陌生……对不起,如果我看起来很密集)

标签: iphone objective-c ios4 uiviewcontroller


【解决方案1】:

我想出了这个:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //...
    if(!loggedIn)
    {
        // Launch the app with login controller as the rootController
        self.window.rootViewController = loginController;

        // ...but switch to the original controller as soon as the UI is presented
        dispatch_async(dispatch_get_main_queue(), ^{
            self.window.rootViewController = originalRootController;

            // ...and silently present the login controller again with no noticeable changes
            [originalRootController presentViewController:loginController
                                                 animated:NO
                                               completion:NULL];
        });
    }

【讨论】:

    【解决方案2】:

    这个post 会给你一些想法。

    【讨论】:

    • 我想在 AppDelegate 中做。
    • 然后代码为, if(IsLoggedIn == NO) { //显示登录控制器 self.window.rootViewController = self.tvc; }
    • 有趣的方法。我最终选择了您链接到的方法来完成它。 :) 我会记住这一点,以备将来修订。
    • 这次我更喜欢@Rivera 的解决方案;推迟视图控制器的显示很有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多