9

Tôi có ứng dụng iOS có UIAlertController dưới dạng một trang tính được hiển thị trong ứng dụng của tôi khi người dùng chạm vào nút.Khối hoàn thành UIAlertAction không được gọi - iOS

Tất cả đều hoạt động tốt, ngoài một điều, các khối hoàn thành không được gọi vì một lý do nào đó.

Đây là mã của tôi:

// 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]; 

Nếu bạn chạy mã mà bạn sẽ thấy những dòng mà gạt bỏ bộ điều khiển sẽ không chạy và không phải sẽ là NSLog tuyên bố bên trong nó. Tuy nhiên, nếu bạn xóa NSLog và đặt khối hoàn thành thành 0, thì nó sẽ chạy .... tại sao ???

Cảm ơn thời gian của bạn, Dan.

Trả lời

34

Đừng cố gắng loại bỏ bộ điều khiển cảnh báo. Nó sẽ được miễn nhiệm cho bạn bởi thời gian xử lý hành động cảnh báo của bạn được gọi.

Thay đổi "hủy bỏ" hành động để:

UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Dismiss" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { 
    NSLog(@"asdhfgjk"); 
}]; 
+1

Tại sao bỏ phiếu xuống? Nếu có điều gì sai với câu trả lời, ít nhất hãy giải thích vấn đề là gì. – rmaddy

+2

Tôi không biết ai đã bỏ phiếu cho bạn, nhưng tôi đang bỏ phiếu cho câu trả lời của bạn và đánh dấu nó vì nó đã giải quyết được vấn đề của tôi một cách hoàn hảo, cảm ơn. Nghĩ lại thì, tôi không biết tại sao tôi lại ấn tượng rằng tôi cần nói với nó để gạt bỏ bộ điều khiển cảnh báo. – Supertecnoboff

+0

Được thăng hạng bởi vì nó đã giúp tôi và vì tôi cũng đã bị bỏ phiếu trước đó mà không đưa ra lý do. SO nên yêu cầu một lý do để được đưa ra trên một downvote. – Alyoshak

2

Các "hủy bỏ" hành động không nên bỏ qua bộ điều khiển xem như đã đề cập bởi rmaddy. Tuy nhiên, ngay cả khi hành động "hủy" được đặt thành:

UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Dismiss" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { 
NSLog(@"asdhfgjk");}]; 

bạn có thể gặp vấn đề tương tự với khối hoàn thành không được gọi. Ví dụ: triển khai phương thức này (hơi có tính chất cạnh tranh):

- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion { 
    [[self presentedViewController] dismissViewControllerAnimated:flag completion:nil]; 
} 

cũng có thể có hiệu ứng này vì UIAlertController bị loại bỏ trước khi khối hoàn thành được gọi.

Các vấn đề liên quan