经过长时间的尝试和搜索Internet和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];

该应用程序具有RootViewController和GeneralViewController,如果用户已经下载了Config包,则在像这样的modalView(在viewDidLoad中)启动后,GeneralViewController将被推入:
GeneralView = [[GeneralViewController alloc] initWithNibName:@"GeneralViewController" bundle:[NSBundle mainBundle]];
        GeneralView.modalTransitionStyle=UIModalTransitionStyleCrossDissolve;
        [self presentViewController:GeneralView animated:YES completion:nil];

在GeneralView中,用户具有更多选项来通过Button打开新视图,并且可以通过IBAction(例如GeneralViewController)将它们推入。

因此,发生这种情况时就会出现问题:

我正在启动应用程序,已经安装了Config程序包,并且用户希望在“ServerViewController”上跟踪其ServerData,因此他为此触摸了相应的按钮。
然后将View推入(现在是RootViewController(由AppDelegate管理)-> GeneralViewController(推入)-> 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现在是 Activity 的View Controller,并且在他的-(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或其他站点中没有任何关于该确切问题的解决方案!

最佳答案

不显示ServerViewController时,您必须删除self作为观察者。将以下代码添加到ServerViewController中:

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

关于iphone - ModalViewController不在窗口层次结构中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18749368/

10-09 16:12