Mac Catalyst 中的弃用警告,但仅在 Objective-C 中,而不是在 Swift 中

Posted

技术标签:

【中文标题】Mac Catalyst 中的弃用警告,但仅在 Objective-C 中,而不是在 Swift 中【英文标题】:Deprecation warning in Mac Catalyst but only in Objective-C, not in Swift 【发布时间】:2020-02-04 07:59:59 【问题描述】:

我在 Catalina (10.15) 的 GM 版本上使用 Xcode 11。我正在为 Mac Catalyst 构建我的 ios 应用程序。我的 iOS 应用的部署目标是 iOS 11。

我在视图控制器中有一条简单的线,例如:

self.modalInPopover = YES;

在 iOS 中编译干净。当我切换到“我的 Mac”目的地时,我收到了弃用警告:

'modalInPopover' 已弃用:首先在 macCatalyst 13.0 中弃用

好的,好的。我可以切换到 iOS 13 中添加的新方法:

if (@available(iOS 13.0, *)) 
    self.modalInPresentation = YES;
 else 
    self.modalInPopover = YES;

这应该可以解决问题,但我仍然收到关于在 else 块中使用 modalInPopover 的相同弃用警告。

奇怪的是对应的 Swift 代码没有给出任何警告。只有 Objective-C 代码继续给出警告。

if #available(iOS 13, *) 
    self.isModalInPresentation = true
 else 
    self.isModalInPopover = true

我什至尝试将@available 更新为:

if (@available(iOS 13.0, macCatalyst 13.0, *)) 

但这并没有改变任何东西。

以下灾难解决了问题,但不需要它:

#if TARGET_OS_MACCATALYST
    self.modalInPresentation = YES;
#else
    if (@available(iOS 13.0, *)) 
        self.modalInPresentation = YES;
     else 
        self.modalInPopover = YES;
    
#endif

是我遗漏了什么还是这是一个 Xcode 错误?如何在不使用 #if TARGET_OS_MACCATALYST 复制代码的情况下消除 Objective-C 中的弃用警告,而这在 Swift 中是不需要的。

【问题讨论】:

如果你的部署目标是iOS11,你不需要self.modalInPresentation = YES; for iOS 我不知道为什么会这样:针对两个平台的项目应该到处都有目标检查。 @Cy-4AH “灾难”有点强,但它是一个问题,因为它正在复制代码。再说一遍,为什么这只是 Objective-C 的问题而不是 Swift 的问题? 【参考方案1】:

我的 iOS 应用的部署目标是 iOS 11。

这就是为什么。要查看 Swift 中的弃用警告,您需要说 isModalInPopover not in an available 子句,部署目标为 iOS 13。

对于 Catalyst 构建,您不向后兼容(没有向后兼容),因此就好像这是 iOS 13 部署目标,您会看到警告。

【讨论】:

这样想:这只是一个弃用。如果您说 iOS 13 中已弃用的内容,但您处于 iOS 11 部署目标中,则您的代码适用于 iOS 11 和 iOS 12,并且它实际上可以在 iOS 13 中运行,因此没有必要拉动您的链。但是,如果您切换到 iOS 13 部署目标,iOS 13 的所有弃用警告都会立即生效。我的技术就是这样做,暂时切换到 iOS 13 部署目标,以便我可以查看是否不小心使用了任何已弃用的 API,然后再切换回来。 但我的问题是基于一个测试 iOS 项目,其中混合了 Swift 和 Objective-C 代码,部署目标为 iOS 12。该项目仅在构建时对 Objective-C 代码给出弃用警告一台Mac。为什么只对同一项目中的 Objective-C 代码而不是 Swift 代码给出警告? 因为 Swift 在可用性方面更聪明?我的意思是,请尝试我所说的,你会发现这是真的:iOS 13 弃用警告仅在部署目标是 iOS 13 时才会出现。这种行为并不新鲜:正如我所说,我经常按顺序玩这个游戏了解新的弃用。 嗯,最终的问题是我如何在 Objective-C 中干净地编译,而不必使用 #if TARGET_OS_MACCATALYST 复制代码? 好吧,这听起来很有趣,但这不是你问的问题。【参考方案2】:

您可以在不同平台上运行时使用它来检查:

#if targetEnvironment(macCatalyst)
    print("UIKit running on macOS")
#elseif os(watchOS)
    print("Running on watchOS")
#else
    print("Your regular code")
#endif

它也应该删除警告。 更多细节可以在这里找到:https://www.hackingwithswift.com/example-code/catalyst/how-to-detect-your-ios-app-is-running-on-macos-catalyst

【讨论】:

以上是关于Mac Catalyst 中的弃用警告,但仅在 Objective-C 中,而不是在 Swift 中的主要内容,如果未能解决你的问题,请参考以下文章

sklearn MiniBatchKMeans 中的弃用警告

节点 js 应用程序中的弃用警告

节点 js 应用程序中的弃用警告

关闭 PHP.ini 文件 WAMP 中的弃用警告

Python中的弃用警告,在这里有意义吗?

sklearn 的弃用警告