在我的应用程序中,我使用两个故事板。 Main和Main2。
主要故事板有两个VC,第一个嵌入到导航控制器中。同样适用于 Main2 故事板。 FirstVC中的-buttonPressed
将推送到主要中的SecondVC。 SecondVC中的-buttonPressed
将呈现 Main2 故事板的FirstVC。 FirstVC中的-buttonPressed
将推送到 Main2 中的SecondVC。
我有一个类NetworkConnection,它是一个共享实例。当可达性改变时,我正在调用以下方法
- (void)internetConnectionAlert {
NetworkStatus status = [[Reachability reachabilityForInternetConnection] currentReachabilityStatus];
id obj = [[[UIApplication sharedApplication] keyWindow] rootViewController];
if ([obj isKindOfClass:[UINavigationController class]] && (status == NotReachable)) {
UIViewController *viewController = [[obj viewControllers] lastObject];
[viewController presentViewController:self.alertController
animated:YES
completion:nil];
} else {
[self.alertController dismissViewControllerAnimated:YES completion:nil];
}
}
我运行应用程序。 Main 的FirstVC出现了。我断开网络连接。由于可达性已更改,AlertController
已过来。我连接回网络。 AlertController
被解雇了。当我去SecondVC时(仍然在 Main )也是如此。所以一切都很好。
我按下SecondVC中的按钮,然后转到 Main2 的FirstVC。现在,当我断开网络连接时,不会弹出AlertController
。
所以我放了一些日志。当我从一个故事板转到另一个故事板时,rootViewController没有更改为新的导航控制器。 rootViewController仍然是 Main 中的导航控制器,而不是 Main2 中的导航控制器。
这是我在 Main2
中放入FirstVC-viewDidLoad
的日志
NSLog(@"Key window rvc : %@",[[[UIApplication sharedApplication] keyWindow] rootViewController]);
NSLog(@"self navi vc : %@",self.navigationController);
打印
2016-06-24 18:55:16.622 Navi[12129:3257811] Key window rvc : <UINavigationController: 0x7feaac834800>
2016-06-24 18:55:16.622 Navi[12129:3257811] self navi vc : <UINavigationController: 0x7feaac832800>
因此我收到以下警告
Warning: Attempt to present <UIAlertController: 0x7feaab524490> on <SecondViewController: 0x7feaab657330> whose view is not in the window hierarchy
当我将以下代码放在 Main2 的FirstVC的-viewDidLoad
中时,我得到了正确的结果。
[[UIApplication sharedApplication] keyWindow].rootViewController = self.navigationController;
我认为这没有任何好处,因为我几乎肯定会在我的代码中的某个位置需要原始的rootViewController。此外,当项目在每个VC中使用上述代码变得更大时,这将是一个麻烦。
那么如何让AlertController显示在当前的ViewController(屏幕上)上,而不管分层的混乱。
感谢您的耐心等待。
编辑:要快速了解this正在发生的事情(尽管没有nil问题)。
更改故事板的代码
- (IBAction)buttonTapped:(id)sender {
MainTwoViewController *mainTwoVC = [[UIStoryboard storyboardWithName:@"Main2" bundle:nil] instantiateInitialViewController];
[self presentViewController:mainTwoVC animated:YES completion:nil];
}