关闭UIAlertController

时间:2017-04-05 17:17:06

标签: ios objective-c cocoa-touch

我在理解iOS视图控制器和警报控制器如何在特定情况下工作时遇到了问题:

我有一个自定义UINavigationController,其中有UIViewController。我的导航控制器已覆盖dismissViewControllerAnimated:completion方法。从此UIViewController我提出了新的UIAlertController。直到用户点击警报中的任何按钮,一切正常。但是,奇怪的是,我的自定义UINavigationController的dismissViewControllerAnimated:completion方法正在被调用(如果可能的话,我不希望这样...)

警报以常规方式呈现(来自UINavigationController中的UIViewController):

UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"yep" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    [self takeOrder:data];
}];

UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"nope" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {

}];

[confirmOrderAcceptAlert addAction:okAction];
[confirmOrderAcceptAlert addAction:cancelAction];

[self presentViewController:alert animated:YES completion:nil];

是否有任何选项可以阻止此行为?为什么这首先发生?

编辑: dismissViewControllerAnimated:completion的代码:

- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion {
    self.isHeroEnabled = NO;
    [super dismissViewControllerAnimated:flag completion:completion];
}

我正在使用Hero库来设置转换动画,这可能就是这种情况吗?

2 个答案:

答案 0 :(得分:2)

当你是UINavigationController的子类时,它肯定会调用dismissViewControllerAnimated:completion。

为避免干扰库代码,请检查特定的ViewController类型。

例如:

- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion {
    if(![self.visibleViewController isKindOfClass:[UIAlertController class]]){
            self.isHeroEnabled = NO;
    }
    [super dismissViewControllerAnimated:flag completion:completion];
}

答案 1 :(得分:0)

这就是UINavigationController的工作原理

如果您不想为因警报而调用的操作设置HeroEnabled。您可能需要执行类似

的操作

if(![self.visibleViewController isKindOfClass:[UIAlertController class]]) { self.isHeroEnabled = NO }