Ios dismissModalViewControllerAnimated已弃用

Ios dismissModalViewControllerAnimated已弃用,ios,ios6,Ios,Ios6,我刚刚升级到XCode 4.5以更新iOS应用程序,使其在iPhone5的4英寸显示屏上运行,但我收到一个生成错误,它说dismissModalViewControllerAnimated:“不推荐使用”: [self dismissModalViewControllerAnimated:NO]; 我已尝试使用完成处理程序(但设置为NULL)更新到推荐的重载,如下所示: [self dismissModalViewControllerAnimated:NO completion:NULL];

我刚刚升级到XCode 4.5以更新iOS应用程序,使其在iPhone5的4英寸显示屏上运行,但我收到一个生成错误,它说
dismissModalViewControllerAnimated:“不推荐使用”

[self dismissModalViewControllerAnimated:NO];
我已尝试使用完成处理程序(但设置为NULL)更新到推荐的重载,如下所示:

[self dismissModalViewControllerAnimated:NO completion:NULL];
@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
if ([self respondsToSelector:@selector(dismissModalViewControllerAnimated:)]) {
    [self performSelector:@selector(dismissModalViewControllerAnimated:) withObject:[NSNumber numberWithBool:YES]];
} else {
    [self dismissViewControllerAnimated:YES completion:nil];
}
但这一行有两个错误:

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的价值。在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];
}
针对马克的另一条评论:

在我的应用程序中可能有很多If语句!。。。我是 如果考虑创建一个封装此代码的类别,则 在UIViewControler上创建类别是否拒绝

还有一个是完全体面的:

…是否有办法手动使其不显示编译器警告

首先,不,在
UIViewController
上创建一个类别本身不会导致你的应用被拒绝;除非那个分类方法叫做私有API或类似的东西

category方法是编写此类代码的非常好的地方。此外,由于只有一个对不推荐使用的API的调用,因此只有一个编译器警告

要解决Full Sender的评论(问题),可以手动取消编译器警告。category方法也是抑制编译器警告的好地方,因为您只在一个地方抑制警告。您当然不想随意地使编译器静音

如果我要为此编写一个简单的category方法,它可能是这样的:

[self dismissModalViewControllerAnimated:NO completion:NULL];
@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
if ([self respondsToSelector:@selector(dismissModalViewControllerAnimated:)]) {
    [self performSelector:@selector(dismissModalViewControllerAnimated:) withObject:[NSNumber numberWithBool:YES]];
} else {
    [self dismissViewControllerAnimated:YES completion:nil];
}

现在,在iOS 6及更高版本中,您可以使用:

[[Picker presentingViewController] dismissViewControllerAnimated:YES completion:nil];
[self presentViewController:picker animated:YES completion:nil];
而不是:

[[Picker parentViewControl] dismissModalViewControllerAnimated:YES];
…您可以使用:

[[Picker presentingViewController] dismissViewControllerAnimated:YES completion:nil];
[self presentViewController:picker animated:YES completion:nil];
而不是

[self presentModalViewController:picker animated:YES];    

警告仍然存在。为了摆脱它,我将其放入如下选择器:

[self dismissModalViewControllerAnimated:NO completion:NULL];
@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
if ([self respondsToSelector:@selector(dismissModalViewControllerAnimated:)]) {
    [self performSelector:@selector(dismissModalViewControllerAnimated:) withObject:[NSNumber numberWithBool:YES]];
} else {
    [self dismissViewControllerAnimated:YES completion:nil];
}

它有利于像我这样的强迫症患者;)

[自我解除模块化控制器激活:否]已被弃用


使用
[self dismissViewControllerAnimated:NO completion:nil]取而代之。

以下是我使用的相应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];
我“一般”使用了ViewController,并且能够根据调用它的方式(使用setHidden和setImage)使模式视图以不同的方式显示。以前一切都很顺利,但performSelector忽略了“设置”内容,因此,如果您试图像我尝试的那样高效,那么最终它似乎是一个糟糕的解决方案…

使用

[self dismissViewControllerAnimated:NO completion:nil];

支持所有设备4.3及以上版本的最佳方式是什么?新方法在iOS4中不起作用,但旧方法在iOS6中被弃用。“岩石和一个艰难的地方?”马克,我补充了我的答案来解决你的担忧。谢谢。在我的应用程序中可能有很多If语句!我想在使用“modalViewController”属性时也可以使用相同的方法。我正在考虑创建一个封装此代码的类别,在UIViewControler上创建一个类别会让我被拒绝吗?对于代码
if([self-respondsToSelector:@selector(presentViewController:animated:completion:)]){[self-presentViewController:test animated:YES completion:nil];}否则{[self-presentModalViewController:测试动画:是];}
有没有办法手动使其不显示编译器警告?@FULLDELENDE是的,你可以。我编辑了我的答案,并提供了一些相关信息。你应该切换if语句,因为我相信不推荐的方法不会导致
respondsToSelector
返回false。因此,新的
将dismissViewControllerAnimated:
将不会被调用,直到将来的更新可能会删除
dismissModalViewControllerAnimated: