当用户点击按钮时,我的应用程序中会显示一个带有UIAlertController的iOS应用程序。
一切都很好,除了一件事,完成块不会因某种原因被调用。
这是我的代码:
// Setup the alert information/type.
UIAlertController *action_view = [UIAlertController alertControllerWithTitle:@"Test title" message:@"test message" preferredStyle:UIAlertControllerStyleActionSheet];
// Create and add the cancel button.
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Dismiss" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) {
[action_view dismissViewControllerAnimated:YES completion:^{
NSLog(@"asdhfgjk");
}];
}];
// Add the action button to the alert.
[action_view addAction:cancel];
// Present the alert to the user.
[self presentViewController:action_view animated:YES completion:nil];
如果运行该代码,您将看到解除控制器不会运行的行,并且其中的NSLog
语句也不会。但是,如果删除NSLog
并将完成块设置为nil,那么它确实运行....为什么???
谢谢你的时间,Dan。
答案 0 :(得分:41)
请勿尝试解除警报控制器。在您的警报操作处理程序被调用时,它将被解雇。
更改"取消"行动:
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Dismiss" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) {
NSLog(@"asdhfgjk");
}];
答案 1 :(得分:2)
“取消”操作不应该忽略rmaddy提到的视图控制器。但是,即使“取消”操作设置为:
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Dismiss" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) {
NSLog(@"asdhfgjk");}];
您可能会看到未调用完成块的相同问题。例如,实现这个(有点人为的)方法:
- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion {
[[self presentedViewController] dismissViewControllerAnimated:flag completion:nil];
}
也可能有这种效果,因为UIAlertController在调用完成块之前被解除。