gpt4 book ai didi

ios - dismissModalViewControllerAnimated 已弃用

转载 作者:IT王子 更新时间:2023-10-29 07:29:17 24 4
gpt4 key购买 nike

我刚刚升级到 XCode 4.5 以更新我的 iOS 应用程序以在 iPhone 5 的 4 英寸显示屏上运行,但我收到构建错误提示 dismissModalViewControllerAnimated:' is deprecated on行:

[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];

modal 一词已被删除;就像呈现 API 调用一样:

[self presentViewController:vc animated:NO completion:nil];

原因在 2012 WWDC Session 236 - The Evolution of View Controllers on iOS 视频中进行了讨论。本质上,此 API 提供的 View Controller 不再总是模态的,并且由于他们正在添加一个完成处理程序,因此是重命名它的好时机。

回应 Marc 的评论:

What's the best way to support all devices 4.3 and above? The new method doesn't work in iOS4, yet the old method is deprecated in iOS6.

我意识到这几乎是一个单独的问题,但我认为值得一提,因为并不是每个人都有钱每 3 年升级一次所有设备,所以我们中的许多人都有一些旧的(5.0 之前的)设备。尽管如此,尽管我很难说,但您需要考虑将目标定在 5.0 以下是否值得。 5.0 以下有许多新的很酷的 API 不可用。而且 Apple 不断加大瞄准他们的难度;例如,Xcode 4.5 不再支持 armv6。

目标低于 5.0(只要完成 block 为 nil)只需使用方便的 respondsToSelector: 方法。

if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:test animated:YES completion:nil];
} else {
[self presentModalViewController:test animated:YES];
}

回应 Marc 的另一条评论:

That could be quite a lot of If statements in my application!...I was thinking of creating a category that encapsulated this code, would creating a category on UIViewControler get me rejected?

还有一个来自 Full Decent:

...is there a way to manually cause that to not present a compiler warning?

首先,不,在 UIViewController 上创建类别本身不会让您的应用程序被拒绝;除非该类别方法调用了私有(private) 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

关于ios - dismissModalViewControllerAnimated 已弃用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12445190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com