我刚刚升级到4.5的XCode更新我的iOS应用到4英寸显示屏的iPhone 5上运行,但是我得到生成错误说dismissModalViewControllerAnimated:' is deprecated
就行了:
[self dismissModalViewControllerAnimated:NO];
我试着更新与完成处理程序推荐的过载(但设置为NULL)是这样的:
[self dismissModalViewControllerAnimated:NO completion:NULL];
但随后该行抛出了两个错误:
warning: 'TabBarController' may not respond to '-presentModalViewController:animated:completion:'
Instance method '-presentModalViewController:animated:completion:' not found (return type defaults to 'id')
谢谢!
新的方法是:
[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(只要完成块是nil)只使用便携式respondsToSelector
:方法。
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:test animated:YES completion:nil];
} else {
[self presentModalViewController:test animated:YES];
}
在回答另一个马克评论:
这可能是相当多的。如果我的应用程序语句!......我在想创建封装的这段代码,会产生对UIViewControler类别得到我拒绝了一个类的?
和一个从全体面:
......有没有办法手动会导致不提出一个编译器警告?
首先,没有,创建一个类UIViewController
本身并不会得到你的应用程序被拒绝; 除非这一类方法称为私人API或类似的东西。
一个类别方法是用于这样的代码一个非常好地方。 此外,由于将有只有一个过时的API调用,将只有一个编译器警告。
为了解决全体面的评论(问题),是的,你可以手动禁止编译器警告。 下面是对非常受回答的链接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
现在,在iOS 6或以上,你可以使用:
[[Picker presentingViewController] dismissViewControllerAnimated:YES completion:nil];
代替:
[[Picker parentViewControl] dismissModalViewControllerAnimated:YES];
...您还可以使用:
[self presentViewController:picker animated:YES completion:nil];
代替
[self presentModalViewController:picker animated:YES];
[self dismissModalViewControllerAnimated:NO];
已被弃用。
使用[self dismissViewControllerAnimated:NO completion:nil];
代替。
使用
[self dismissViewControllerAnimated:NO completion:nil];
警告仍然存在。 为了摆脱它,我把它变成像这样的选择:
if ([self respondsToSelector:@selector(dismissModalViewControllerAnimated:)]) {
[self performSelector:@selector(dismissModalViewControllerAnimated:) withObject:[NSNumber numberWithBool:YES]];
} else {
[self dismissViewControllerAnimated:YES completion:nil];
}
它的好处有像我这样的人OCD)
这里是我使用的,如果它可以帮助其他新手像我这样相应的presentViewController版本:
if ([self respondsToSelector:@selector(presentModalViewController:animated:)]) {
[self performSelector:@selector(presentModalViewController:animated:) withObject:testView afterDelay:0];
} else {
[self presentViewController:configView animated:YES completion:nil];
}
[testView.testFrame setImage:info]; //this doesn't work for performSelector
[testView.testText setHidden:YES];
我用了一个视图控制器“一般”和能够得到的模态视图显示不同,具体取决于它被称为(使用setHidden和setImage)做。 并且事很好的工作之前,但performSelector忽略“设置”的东西,所以最后它似乎是一个贫穷的解决方案,如果您尝试是有效像我试图将...