ModalViewController不在窗口层次结构中

时间:2013-09-11 19:11:28

标签: iphone ios objective-c uiviewcontroller

经过长时间的尝试和搜索互联网和StackOverflow后,我找不到我需要的答案。 我的问题是一个警告:

Warning: Attempt to present <PAPasscodeViewController: 0x81cc8a0> on <ServerViewController: 0x75864b0> whose view is not in the window hierarchy!

我正在使用名为“PAPasscodeViewController”的自定义控件,该东西本身正在工作,但当我尝试在ApplicationDidBecomeActive方法上显示视图时,它会在Consoleoutput中显示此警告。 我正在使用此方法来跟踪通知:

[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(wait)
                                                 name:UIApplicationDidBecomeActiveNotification object:nil];

我的-(void)wait包含以下内容:

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];
    NSLog(@"waiting");
    [self performSelector:@selector(enterPasscode) withObject:nil afterDelay:.3f];

App有一个RootViewController和一个GeneralViewController,如果用户已经下载了一个Config包,那么GeneralViewController在作为modalView开始后被推入(在viewDidLoad中):

GeneralView = [[GeneralViewController alloc] initWithNibName:@"GeneralViewController" bundle:[NSBundle mainBundle]];
        GeneralView.modalTransitionStyle=UIModalTransitionStyleCrossDissolve;
        [self presentViewController:GeneralView animated:YES completion:nil];

在GeneralView中,用户有更多选项可以通过按钮打开新视图,它们可以通过像GeneralViewController这样的IBActions进行推送。

所以当发生这种情况时就会出现问题:

我正在启动App,Config Package已经安装,用户想要在“ServerViewController”上跟踪他的ServerData,所以他触摸了相应的Button。 然后View被推入(它现在的RootViewController(由AppDelegate管理) - &gt; GeneralViewController(推入) - &gt; ServerViewController(推入)),一切正常。 现在当用户回到他的主屏幕时,我正在关闭模态视图“ServerViewController”,如下所示:

-(void)viewDidAppear:(BOOL)animated{
[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(close:)
                                                 name:UIApplicationDidEnterBackgroundNotification object:nil];}

-(IBAction)close:(id)sender{
    [self dismissViewControllerAnimated:YES completion:nil];
}

因此,当应用程序进入后台时,ServerViewController被取消,在恢复应用程序后,GeneralViewController现在是活动的视图控制器,并且在-(void)viewDidAppear我从上面调用-(void)wait时,它调用此功能:

- (void)enterPasscode{
    PAPasscodeViewController *passcodeViewController = [[PAPasscodeViewController alloc] initForAction:PasscodeActionEnter];
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        passcodeViewController.backgroundView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStyleGrouped];
    }
    passcodeViewController.delegate = self;
    passcodeViewController.passcode = [configArray objectAtIndex:3];
    passcodeViewController.simple = YES;
    [self presentViewController:passcodeViewController animated:YES completion:nil];
}

这样工作正常,但后来我从上面收到了令人讨厌的警告(这里再一次让你不必向上滚动)

Warning: Attempt to present <PAPasscodeViewController: 0x75d1c10> on <ServerViewController: 0x818b390> whose view is not in the window hierarchy!
实际上这很令人困惑,因为我认为我的GeneralViewController现在再次成为Active ViewController ...... 也许我只是被这个问题的简单所蒙蔽......但也许有人可以帮助我理解。 我没有在StackOverflow或其他网站的任何其他帖子中找到任何有关该确切问题的解决方案!

1 个答案:

答案 0 :(得分:3)

当您的Server ViewController未显示时,您必须删除self作为观察者。将以下代码添加到Server ViewController:

- (void)viewDidDisappear:(BOOL)animated
{
     [[NSNotificationCenter defaultCenter] removeObserver:self];
}