我在理解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库来设置转换动画,这可能就是这种情况吗?
答案 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
}