新方法是:
[self dismissViewControllerAnimated:NO completion:nil];
modal这个词已被删除;就像呈现的 API 调用一样:
[self presentViewController:vc animated:NO completion:nil];
2012 WWDC Session 236 - iOS 上视图控制器的演变视频中讨论了原因。从本质上讲,这个 API 提供的视图控制器不再总是模态的,因为它们添加了一个完成处理程序,所以现在是重命名它的好时机。
回应 Marc 的评论:
支持所有设备 4.3 及更高版本的最佳方式是什么?新的
方法在 iOS4 中不起作用,但旧方法在 iOS6 中已弃用。
我意识到这几乎是一个单独的问题,但我认为值得一提,因为不是每个人都有钱每 3 年升级一次所有设备,所以我们中的许多人都有一些旧的(5.0 之前的)设备。尽管如此,尽管我说起来很痛苦,但您需要考虑是否值得将其定位在 5.0 以下。在 5.0 以下,有许多新的很酷的 API 不可用。 Apple 不断加大针对他们的难度;例如,从 Xcode 4.5 中删除了 armv6 支持。
要低于 5.0(只要完成块为 nil),只需使用方便的 respondsToSelector: 方法。
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:test animated:YES completion:nil];
} else {
[self presentModalViewController:test animated:YES];
}
回应 Marc 的另一条评论:
我的应用程序中可能有很多 If 语句!...我是
考虑创建一个封装此代码的类别,将
在 UIViewControler 上创建类别让我被拒绝?
还有一个来自 Full Decent:
...有没有办法手动使其不显示编译器警告?
首先,不,在UIViewController 上创建一个类别本身不会让您的应用被拒绝;除非该类别方法称为私有 API 或类似的东西。
类别方法对于此类代码来说是一个非常好的地方。此外,由于只有一次对已弃用 API 的调用,因此只会出现一次编译器警告。
要解决 Full Decent 的评论(问题),是的,您可以手动禁止编译器警告。 Here is a link to an answer on SO on that very subject。类别方法也是抑制编译器警告的好地方,因为您只在一个地方抑制警告。您当然不想无所事事地使编译器静音。
如果我要为此编写一个简单的类别方法,它可能是这样的:
@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