16
if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)])
     {[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];} //post-iOS6.0
else {[self dismissModalViewControllerAnimated:YES];} //pre-iOS6.0

我正在响应选择器(上面)代码来处理不推荐使用的方法。这样我的应用程序与旧版本的 iOS 兼容,但我在代码中收到警告:“'dismissModalViewControllerAnimated:' 已弃用:iOS 6.0 中首次弃用”我个人不喜欢我的代码中的任何警告,但是更重要的是,我在某处读到苹果会抱怨您的代码中出现警告。

1) Apple 会抱怨你代码中的警告吗?

2)我是否正确处理不推荐使用的方法?

3)有没有办法关闭弃用的方法方法警告?

4

3 回答 3

20
  1. Apple 不知道您在代码中收到的任何编译时警告。

  2. 是的,您正确地处理了这种做法。显然,在这种情况下,如果您支持 5.0 之前的 iOS,您只需要完成这项工作。但是,一般来说,测试一个方法是否可以被调用然后调用适当的再现的技术是绝对正确的。

  3. 如果您想关闭警告,您只需暂时禁止警告,然后使用适当的#pragma语法将其重新打开:

    if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)])
    {
        //post-iOS6.0
        [self dismissViewControllerAnimated:YES completion:nil];
    } 
    else
    {
        // pre-iOS6.0
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wdeprecated-declarations"
        [self dismissModalViewControllerAnimated:YES];
    #pragma clang diagnostic pop
    }
    

    顺便说一句,如果您想知道-W您的特定警告的代码是什么,请转到您的日志导航器,选择包含该警告的最近构建,然后展开日志,您将在那里看到它:

    在此处输入图像描述

另请注意,虽然您可以像我上面说明的那样抑制警告,但实际上,您很少需要这样做。使用您的示例,如果您的项目的 iOS 部署目标是 4.3,您将不会收到警告。如果您的部署目标是 6.0 或更高版本,您会收到该警告,但话又说回来,您可能不需要此条件代码来调用dismissModalViewControllerAnimated,因为有效的 iOS 5.0,您始终可以使用dismissViewControllerAnimated.

唯一需要在代码中抑制此警告的情况是,如果您有源代码,将来要包含在项目中,而您不知道部署目标是什么。使用您的示例,如果您不知道上述代码是否将包含在具有 4.3 部署目标或 5.0+ 部署目标的项目中。在这种情况下,这种语法非常有用。但是,话又说回来,我也可以对 使用条件检查__IPHONE_OS_VERSION_MIN_REQUIRED,例如:

#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0
    if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)])
    {
        //post-iOS5.0
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    else
    {
        // pre-iOS5.0
        [self dismissModalViewControllerAnimated:YES];
    }
#else
    [self dismissViewControllerAnimated:YES completion:nil];
#endif
于 2013-09-01T02:02:59.003 回答
1
  1. 除非您特别尝试支持旧 iOS 版本,否则您应该使用最新的方法,然后您应该使用上面列出的方法。“一种被确定为已弃用的方法已被取代,将来可能不受支持。”
  2. 如果您将应用程序目标中的部署目标更改为 5.0,iOS 5 not 的已弃用警告将显示为错误。

如果您真的对向后兼容性感兴趣,这里有 Ray Wenderlich 的精彩教程

于 2013-09-01T01:56:15.070 回答
0

是的,存在许多警告并以模态方式关闭视图以修复该替换:

在 ios 6 中,这些是:-

  1. [self dismissViewControllerAnimated:NO completion:nil];

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

于 2013-10-21T12:23:29.600 回答