1

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

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

我正在使用一个名为“PAPasscodeViewController”的自定义控件,它本身正在工作,但是当我尝试在 ApplicationDidBecomeActive 方法上显示视图时,它会在控制台输出中显示此警告。我正在使用这种方法来跟踪通知:

[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 包,GeneralViewController 在作为 modalView 启动后会被推入,如下所示(在 中viewDidLoad):

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

在 GeneralView 中,用户有更多选项来通过按钮打开新视图,并且它们通过 IBActions (如 GeneralViewController)被推入。

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

我正在启动应用程序,配置包已经安装,用户想要在“ServerViewController”上跟踪他的 ServerData,所以他为此触摸了相应的按钮。然后视图被推入(它现在的 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 现在是活动的视图控制器,在他-(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 或其他网站的任何其他帖子中都没有找到任何解决方案!

4

1 回答 1

3

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

- (void)viewDidDisappear:(BOOL)animated
{
     [[NSNotificationCenter defaultCenter] removeObserver:self];
}
于 2013-09-11T19:27:58.830 回答