【问题标题】:How to use view modifiers only available for iOS 14+ with deployment target of iOS 13如何使用仅适用于 iOS 14+ 且部署目标为 iOS 13 的视图修饰符
【发布时间】:2020-11-14 13:06:39
【问题描述】:

当视图仅适用于 iOS 14 而您的应用适用于 iOS 13 时,如何向视图添加视图修饰符?

例如,textCase(_)。 iOS 14 中的部分标题是大写的,因此要使用标题文本的大小写,您应该在 Text 上设置 .textCase(.none),但这直到 iOS 14 才存在。

Section(header:
    Text("Header")
        .textCase(.none) //FIXME: 'textCase' is only available in iOS 14.0 or newer
        .font(.system(size: 14, weight: .bold))
        .foregroundColor(.secondary)
        .padding(.top, 50)
)

Xcode 提供了一些建议:

  • 添加 if #available 版本检查
  • 添加@available 属性

如果您使用#available 版本检查,它会使用#available 包装所有范围内的代码,因此您必须复制所有这些代码才能添加那一行代码。如果您使用@available,则必须复制整个 body 属性或整个结构。

我考虑过创建我自己的 ViewModifier,它只会在 iOS 14 中应用,但会出现这个可怕的错误:

函数声明了一个不透明的返回类型,但返回语句在 它的主体没有匹配的底层类型

struct CompatibleTextCaseModifier: ViewModifier {
    func body(content: Content) -> some View {
        if #available(iOS 14.0, *) {
            return content
                .textCase(.none)
        } else {
            return content
        }
    }
}

【问题讨论】:

    标签: ios swiftui ios14


    【解决方案1】:

    body 标记为@ViewBuilder - 这将允许自动跟踪内部不同的返回类型,并删除return,因为显式返回会禁用视图构建器包装器。

    所以这里是固定变体

    struct CompatibleTextCaseModifier: ViewModifier {
    
        @ViewBuilder
        func body(content: Content) -> some View {
            if #available(iOS 14.0, *) {
                content
                    .textCase(.none)
            } else {
                content
            }
        }
    }
    

    和用法

    Section(header:
        Text("Header")
            .modifier(CompatibleTextCaseModifier())
            .font(.system(size: 14, weight: .bold))
            .foregroundColor(.secondary)
            .padding(.top, 50)
    ) {
        Text("test")
    }
    

    【讨论】:

    • 这个解决方案可以消除错误,但会在 iOS 13 中为我删除标题。为了解决这个问题,我用保护 #available 替换了 if #available(并翻转了案例),效果很好!
    • 没关系,守卫在 iOS 14 中不起作用。任何关于这方面的建议都会很棒。
    • 这个解决方案非常适合像这样的简单情况,但是如果你有一个大项目有几十个或几百个仅在 iOS 14 中可用的视图修改器,那么为每个案例创建一个兼容的修改器将是令人生畏,您将发送奇怪的视图修饰符名称,我为此创建了一个新问题:stackoverflow.com/questions/68892142/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2021-02-20
    • 2020-02-05
    • 2021-05-20
    • 2021-08-19
    • 1970-01-01
    相关资源
    最近更新 更多