经过长时间的尝试和搜索互联网和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或其他网站的任何其他帖子中找到任何有关该确切问题的解决方案!
答案 0 :(得分:3)
当您的Server ViewController未显示时,您必须删除self作为观察者。将以下代码添加到Server ViewController:
- (void)viewDidDisappear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}