尝试显示视图控制器警告
Attempt to present View Controller Warning
我有以下 ViewController 会在某事完成时显示下一个 ViewController:
Nr1: 我的游戏ViewController 检查游戏是否完成并调用 CheckGameFinished:
-(void) checkGameFinished {
if ([self.gameModel isGameOver]) {
double delayTimeInSeconds = 3.5;
dispatch_time_t popTimeDelay = dispatch_time(DISPATCH_TIME_NOW, delayTimeInSeconds * NSEC_PER_SEC);
dispatch_after(popTimeDelay, dispatch_get_main_queue(), ^(void){
[progressBarTimer invalidate];
level2ViewController *govc = [self.storyboard instantiateViewControllerWithIdentifier:@"level2ViewController"];
[self.finishAudio play];
[self presentViewController:govc animated:NO completion:^(){
[self.gameModel clearGameData];
}];
});
}
}
然后level2ViewController出现:
- (void)viewDidLoad {
[super viewDidLoad];
double delayTimeInSeconds = 2;
dispatch_time_t popTimeDelay = dispatch_time(DISPATCH_TIME_NOW, delayTimeInSeconds * NSEC_PER_SEC);
dispatch_after(popTimeDelay, dispatch_get_main_queue(), ^(void){
GameViewController *gvc = [self.storyboard instantiateViewControllerWithIdentifier:@"gameViewController"];
[self presentViewController:gvc animated:NO completion:nil];
});
}
并调用下一个ViewController,以此类推。
现在我超时收到以下警告:
Warning: Attempt to present GameViewController on level2ViewController
whose view is not in the window hierarchy!
不要显示来自 viewDidLoad
的视图控制器,而是从 viewDidAppear:
调用。同样使用 dispatch_after
那样(假设您使用它来希望确保视图在屏幕上而不是出于游戏目的)是一种非常糟糕的做法。
当正在加载的视图控制器完成呈现时(调用 viewDidAppear:
时发生),您可以呈现不同的视图控制器:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
GameViewController *gvc = [self.storyboard instantiateViewControllerWithIdentifier:@"gameViewController"];
[self presentViewController:gvc animated:NO completion:nil];
}
当我的 segue
类型是 modal
时,我得到了这个,更改为 push
为我修复了它
我有以下 ViewController 会在某事完成时显示下一个 ViewController:
Nr1: 我的游戏ViewController 检查游戏是否完成并调用 CheckGameFinished:
-(void) checkGameFinished {
if ([self.gameModel isGameOver]) {
double delayTimeInSeconds = 3.5;
dispatch_time_t popTimeDelay = dispatch_time(DISPATCH_TIME_NOW, delayTimeInSeconds * NSEC_PER_SEC);
dispatch_after(popTimeDelay, dispatch_get_main_queue(), ^(void){
[progressBarTimer invalidate];
level2ViewController *govc = [self.storyboard instantiateViewControllerWithIdentifier:@"level2ViewController"];
[self.finishAudio play];
[self presentViewController:govc animated:NO completion:^(){
[self.gameModel clearGameData];
}];
});
}
}
然后level2ViewController出现:
- (void)viewDidLoad {
[super viewDidLoad];
double delayTimeInSeconds = 2;
dispatch_time_t popTimeDelay = dispatch_time(DISPATCH_TIME_NOW, delayTimeInSeconds * NSEC_PER_SEC);
dispatch_after(popTimeDelay, dispatch_get_main_queue(), ^(void){
GameViewController *gvc = [self.storyboard instantiateViewControllerWithIdentifier:@"gameViewController"];
[self presentViewController:gvc animated:NO completion:nil];
});
}
并调用下一个ViewController,以此类推。
现在我超时收到以下警告:
Warning: Attempt to present GameViewController on level2ViewController whose view is not in the window hierarchy!
不要显示来自 viewDidLoad
的视图控制器,而是从 viewDidAppear:
调用。同样使用 dispatch_after
那样(假设您使用它来希望确保视图在屏幕上而不是出于游戏目的)是一种非常糟糕的做法。
当正在加载的视图控制器完成呈现时(调用 viewDidAppear:
时发生),您可以呈现不同的视图控制器:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
GameViewController *gvc = [self.storyboard instantiateViewControllerWithIdentifier:@"gameViewController"];
[self presentViewController:gvc animated:NO completion:nil];
}
当我的 segue
类型是 modal
时,我得到了这个,更改为 push
为我修复了它