新方法是:
[self dismissViewControllerAnimated:NO completion:nil];
情态一词已被删除;与呈现API调用一样:
[self presentViewController:vc animated:NO completion:nil];
原因在2012年WWDC会议236-iOS视频上的视图控制器的演变中进行了讨论。本质上,此API提供的视图控制器不再总是模态的,并且由于它们添加了完成处理程序,因此现在是重命名它的好时机。
回应马克的评论:
支持所有4.3及更高版本设备的最佳方法是什么?新方法在iOS4中不起作用,但旧方法在iOS6中已弃用。
我意识到这几乎是一个单独的问题,但我认为值得一提,因为并非每个人都有钱每3年升级一次所有设备,因此我们许多人都拥有一些较旧的(5.0之前的)设备。尽管如此,我仍然难以置信,但您仍需要考虑是否值得在5.0以下定位。在5.0以下,有许多新的很酷的API不可用。苹果不断地将目标锁定在目标上。例如,armv6支持从Xcode 4.5中删除。
要定位到低于5.0的目标(只要完成块为零),请使用handy respondsToSelector
:方法。
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:test animated:YES completion:nil];
} else {
[self presentModalViewController:test animated:YES];
}
在回应Marc的另一条评论时:
我的应用程序中可能有很多If语句!...我正在考虑创建一个封装此代码的类别,是否会在UIViewControler上创建一个类别使我遭到拒绝?
还有一个来自《体面》:
...有没有办法手动导致不显示编译器警告?
首先,不,UIViewController
在本身上创建类别不会使您的应用程序被拒绝;除非该类别方法称为私有API或类似的东西。
类别方法是此类代码的绝佳选择。而且,由于将仅对已弃用的API进行一次调用,因此将只有一个编译器警告。
要解决Full Decent的注释(问题),可以,您可以手动禁止编译器警告。这是有关该主题的SO答案的链接。类别方法也是抑制编译器警告的好地方,因为您只在一个地方抑制了警告。您当然不想四处闲逛使编译器静音。
如果要为此编写一个简单的类别方法,则可能是这样的:
@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