在当前显示视图控制器上显示警报控制器

时间:2016-06-24 13:43:41

标签: ios objective-c uiviewcontroller uinavigationcontroller uiwindow

在我的应用程序中,我使用两个故事板。 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];
}

0 个答案:

没有答案