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