我应该如何从 TabBarController 呈现模态视图控制器

Posted

技术标签:

【中文标题】我应该如何从 TabBarController 呈现模态视图控制器【英文标题】:How should I present a Modal VIew Controller from TabBarController 【发布时间】:2013-09-07 14:51:37 【问题描述】:

我有一个应用程序,其初始场景是带有 3 个选项卡的选项卡栏控制器。我创建了一个 uitabbarcontroller 类并将其设置为该场景 (MainTabViewController)。

在该类中,我从 viewDidAppear 方法调用 presentLogin,该方法显示为:

- (void)presentLogin
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    if (![prefs stringForKey:@"storedUser"] && ![prefs stringForKey:@"storedPass"]) 
        NSLog(@"No user prefs stored");

        // BUT WAIT, before all this, lets pop up a view controller for user registration
        UIStoryboard*  sb = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
        ModalViewController *popupController = [sb instantiateViewControllerWithIdentifier:@"ModalViewController"];
        [self presentViewController:popupController animated:YES completion:nil];

     else 
        NSString *storedUser = [NSString stringWithFormat:@"User:%@",[prefs stringForKey:@"storedUser"]];
        NSString *storedPass = [NSString stringWithFormat:@"User:%@",[prefs stringForKey:@"storedPass"]];
        UIAlertView *internetAlert = [[UIAlertView alloc] initWithTitle:storedUser
                                                                message:storedPass
                                                               delegate:self
                                                      cancelButtonTitle:@"Cancel"
                                                      otherButtonTitles:@"Ok", nil];
        [internetAlert show];

    

但由于某种原因,modalVC 没有显示。我得到了这个崩溃日志:

Attempting to begin a modal transition from <MainTabViewController: 0xa55d0d0> to <ModalViewController: 0x15e2b5e0> while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear to know the current transition has completed

【问题讨论】:

【参考方案1】:

我相信您会收到此错误,因为标签栏控制器将控制器的视图放在屏幕上的第一个标签中,同时您正在呈现模态控制器。与其从选项卡栏控制器显示它,不如在第一个选项卡中控制器的 viewDidAppear 方法中显示它。在没有动画的情况下调用它以查看模态视图控制器而不查看第一个选项卡控制器。

【讨论】:

解决问题的是 ANIMATION:NO!谢谢。【参考方案2】:

尝试添加一个微小的延迟,如下所示:

- (void)viewDidAppear:(BOOL)animated

    [super viewDidAppear:animated];
    [self performSelector:@selector(presentLogin) withObject:nil afterDelay:0.1];

【讨论】:

【参考方案3】:

标签栏控制器的视图包含标签栏本身拥有的视图控制器的视图层次结构。也许是因为这个。如果您只将一个视图控制器设置为标签栏,请尝试查看是否仍然出现错误。

【讨论】:

以上是关于我应该如何从 TabBarController 呈现模态视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何从 TabBarController 上 NavigationController 的 TableViewController 子项锁定旋转

TabBarController 和 NavigationController

MonoTouch:如何从 TabBarController 的多个视图中选择初始视图

将 TabBarController 推送到视图

如果它在 TabBarController 中,如何从 AppDelegate 访问 ViewController 的属性?

如何通过 TabBarController => NavbarController 从 Appdelegate 呈现视图控制器