【问题标题】:Conditionally add commands to SwiftUI WindowGroup有条件地向 SwiftUI WindowGroup 添加命令
【发布时间】:2022-02-13 00:30:35
【问题描述】:

在 macOS 12 中,Apple 通过引入命令组 ImportFromDevicesCommands 来修复 SwiftUI 中省略的“Continuity Camera”,该命令组可以简单地添加到窗口中。

但是当您尝试在支持 ma​​cOS 11 和 12 的应用中使用它时,您会错过条件支持,因为在组合 SwiftUI 视图时很常见。

我尝试了以下方法:

import SwiftUI

@main
struct ThrowAwayApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .commands {
            if #available(macOS 12, *) {
                ImportFromDevicesCommands()
            }
        }
    }
}

但是编译器会弹出以下错误信息:

Closure containing control flow statement cannot be used with result builder 'CommandsBuilder'

我了解CommandsBuilder 不支持buildIf()buildEither(first:)buildEither(second:),因此缺少if-block 对SwiftUI 视图的支持。

有没有办法有条件地将命令添加到WindowGroup? 我可以用@available 做一些诡计吗? (我真的很想念@unavailable...)

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    我想出了一个解决方案,它允许我通过在 Xcodes 中定义 derived 用户定义的构建配置来检查代码是为 macOS 11 还是 macOS 12 编译的项目设置:

    TARGET_MAJOR = $(SUPPORTED_PLATFORMS:upper)$(MACOSX_DEPLOYMENT_TARGET:base)
    

    然后在Other Swift Flags

    中引用这个变量
    OTHER_SWIFT_FLAGS = -DTARGET_$(TARGET_MAJOR)
    

    之后我可以使用以下方法有条件地为 macOS 12 编译代码:

    WindowGroup {
        ContentView()
    }
    .commands {
    #if TARGET_MACOSX12
        ImportFromDevicesCommands()
    #elseif TARGET_MACOSX11
        #warning("ImportFromDevicesCommands not implemented")
    #endif
    }
    

    【讨论】:

    • 另见我的适用于跨平台条件编译的答案:stackoverflow.com/questions/24369272/…
    • 为了支持旧的 iOS 版本,我们不得不跳过这么多圈,真是令人失望,尤其是当可用性作为特例内置于结果构建器时 (buildLimitedAvailability)!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2016-05-22
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多