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 中的主要内容,如果未能解决你的问题,请参考以下文章