我刚刚升级到XCode 4.5来更新我的iOS应用程序,以便在iPhone 5的4英寸显示屏上运行,但是我收到了一条构建错误说dismissModalViewControllerAnimated:' is deprecated:
[self dismissModalViewControllerAnimated:NO];
Run Code Online (Sandbox Code Playgroud)
我尝试使用完成处理程序(但设置为NULL)更新到建议的重载,如下所示:
[self dismissModalViewControllerAnimated:NO completion:NULL];
Run Code Online (Sandbox Code Playgroud)
但是这一行引发了两个错误:
warning: 'TabBarController' may not respond to '-presentModalViewController:animated:completion:'
Instance method '-presentModalViewController:animated:completion:' not found (return type defaults to 'id')
Run Code Online (Sandbox Code Playgroud)
谢谢!
NJo*_*nes 305
新方法是:
[self dismissViewControllerAnimated:NO completion:nil];
Run Code Online (Sandbox Code Playgroud)
莫代尔这个词已被删除; 正如演示API调用一样:
[self presentViewController:vc animated:NO completion:nil];
Run Code Online (Sandbox Code Playgroud)
原因在2012 WWDC Session 236 - iOS视频中视图控制器的演变中进行了讨论.从本质上讲,这个API提供的视图控制器不再是模态的,因为它们正在添加一个完成处理程序,所以现在是重命名它的好时机.
回应马克的评论:
什么是支持4.3及以上所有设备的最佳方式?新方法在iOS4中不起作用,但旧方法在iOS6中已弃用.
我意识到这几乎是一个单独的问题,但我认为值得一提,因为不是每个人都有钱每3年升级一次所有设备,所以我们很多人都有一些旧的(5.0之前的)设备.尽管如此,我还是很难说,你需要考虑是否值得将目标定在5.0以下.5.0以下没有许多新的和酷的API.苹果公司不断努力瞄准它们; 例如,从Xcode 4.5中删除了armv6支持.
要目标低于5.0(只要完成块为零),只需使用方便的respondsToSelector方法.
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:test animated:YES completion:nil];
} else {
[self presentModalViewController:test animated:YES];
}
Run Code Online (Sandbox Code Playgroud)
回应马克的另一条评论:
这可能是我的应用程序中的很多If语句!...我正在考虑创建一个封装此代码的类别,在UIViewControler上创建一个类别让我被拒绝?
和一个来自Full Decent:
...有没有办法手动导致它不呈现编译器警告?
首先,不,在内部创建一个类别UIViewController本身不会让您的应用被拒绝; 除非该类别方法称为私有API或类似的东西.
类别方法对于这样的代码来说是非常好的地方.此外,由于只有一次调用已弃用的API,因此只会有一个编译器警告.
要解决Full Decent的评论(问题),是的,您可以手动抑制编译器警告.以下是关于该主题的答案的链接.类别方法也是抑制编译器警告的好地方,因为您只是在一个地方抑制警告.你肯定不想无缘无故地绕过编译器.
如果我要为此编写一个简单的类别方法,它可能是这样的:
@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
Run Code Online (Sandbox Code Playgroud)
现在在iOS 6及更高版本中,您可以使用:
[[Picker presentingViewController] dismissViewControllerAnimated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)
代替:
[[Picker parentViewControl] dismissModalViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)
...你可以使用:
[self presentViewController:picker animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)
代替
[self presentModalViewController:picker animated:YES];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
99458 次 |
| 最近记录: |