Phương pháp mới là:
[self dismissViewControllerAnimated:NO completion:nil];
Từ modal đã bị loại bỏ; Như đã từng xảy ra đối với lệnh gọi API trình bày:
[self presentViewController:vc animated:NO completion:nil];
Các lý do đã được thảo luận trong Phiên 236 WWDC 2012 - Sự phát triển của bộ điều khiển chế độ xem trên video iOS . Về cơ bản, các bộ điều khiển chế độ xem được trình bày bởi API này không còn luôn là phương thức nữa, và vì chúng đã thêm một trình xử lý hoàn thành, nên đã đến lúc đổi tên nó.
Đáp lại bình luận từ Marc:
Cách tốt nhất để hỗ trợ tất cả các thiết bị 4.3 trở lên là gì? Phương pháp mới không hoạt động trong iOS4, nhưng phương pháp cũ không được dùng trong iOS6.
Tôi nhận ra rằng đây gần như là một câu hỏi riêng biệt, nhưng tôi nghĩ nó đáng được đề cập vì không phải ai cũng có tiền để nâng cấp tất cả các thiết bị của họ 3 năm một lần nên nhiều người trong chúng ta có một số thiết bị cũ hơn (trước 5.0). Tuy nhiên, tôi thấy rất khó khi phải nói điều đó, bạn cần cân nhắc xem nó có đáng được nhắm mục tiêu dưới 5.0 hay không. Có nhiều API mới và thú vị không có sẵn dưới 5.0. Và Apple liên tục làm cho việc nhắm mục tiêu họ trở nên khó khăn hơn; Ví dụ: hỗ trợ armv6 bị loại bỏ khỏi Xcode 4.5.
Để nhắm mục tiêu dưới 5,0 (miễn là khối hoàn thành bằng không) chỉ cần sử dụng respondsToSelector
phương thức tiện dụng :.
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:test animated:YES completion:nil];
} else {
[self presentModalViewController:test animated:YES];
}
Đáp lại một bình luận khác từ Marc:
Đó có thể là khá nhiều câu lệnh If trong ứng dụng của tôi! ... Tôi đang nghĩ đến việc tạo một danh mục đóng gói mã này, liệu việc tạo một danh mục trên UIViewControler có khiến tôi bị từ chối không?
và một từ Full Decent:
... có cách nào để khiến điều đó không hiển thị cảnh báo trình biên dịch theo cách thủ công không?
Thứ nhất, không, tạo một danh mục trên UIViewController
trong và ngoài chính nó sẽ không khiến ứng dụng của bạn bị từ chối; trừ khi phương thức danh mục đó được gọi là các API riêng tư hoặc thứ gì đó tương tự.
Phương pháp danh mục là một nơi cực kỳ tốt cho mã như vậy. Ngoài ra, vì sẽ chỉ có một lệnh gọi tới API không dùng nữa, nên sẽ chỉ có một cảnh báo trình biên dịch.
Để giải quyết nhận xét (câu hỏi) của Full Decent, có, bạn có thể chặn cảnh báo trình biên dịch theo cách thủ công. Đây là một liên kết đến một câu trả lời trên SO về chủ đề đó . Phương thức danh mục cũng là một nơi tuyệt vời để ngăn chặn cảnh báo trình biên dịch, vì bạn chỉ ngăn cảnh báo ở một nơi. Bạn chắc chắn không muốn đi xung quanh để làm im lặng trình biên dịch willy-nilly.
Nếu tôi viết một phương thức danh mục đơn giản cho điều này, nó có thể giống như thế này:
@implementation UIViewController (NJ_ModalPresentation)
-(void)nj_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion{
NSAssert(completion == nil, @"You called %@ with a non-nil completion. Don't do that!",NSStringFromSelector(_cmd));
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:viewControllerToPresent animated:flag completion:completion];
} else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
[self presentModalViewController:viewControllerToPresent animated:flag];
#pragma clang diagnostic pop
}
}
@end