【问题标题】:How to wrap #available in this custom .if extension on a SwiftUI View?如何在 SwiftUI 视图的这个自定义 .if 扩展中包装#available?
【发布时间】:2021-10-18 18:41:35
【问题描述】:

我正在使用这个 .if 扩展,它工作得很好,应该添加到 SwiftUI,但是在这种情况下检查 #available 将不起作用,因为 #available may only be used as condition of an 'if', 'guard' or 'while' statement 我怎样才能使它与这个 @987654324 一起工作@,无论如何?

    //Does not compile for #available may only be used as condition of an 'if', 'guard' or 'while' statement
   ForEach...
   .if(#available(iOS 15.0, *)) { $0.refreshable {
                        
                    } }

extension View {
  @ViewBuilder
  func `if`<Transform: View>(
    _ condition: Bool,
    transform: (Self) -> Transform
  ) -> some View {
    if condition {
      transform(self)
    } else {
      self
    }
  }
}

【问题讨论】:

    标签: ios swift swiftui viewbuilder swiftui-view


    【解决方案1】:

    我通常会做.if(true) 然后检查闭包内的可用性。很遗憾,我们无法在 if 修饰符中检查可用性。

    例子:

    struct ContentView: View {
        var body: some View {
            List {
                Text("Hello")
                /* More list items... */
            }
            .if(true) {
                if #available(iOS 15, *) {
                    $0.refreshable {
                        //
                    }
                } else {
                    $0
                }
            }
        }
    }
    

    @ViewBuilder 添加到transform 参数,以便您可以在if 中返回不同的View 类型:

    extension View {
        @ViewBuilder func `if`<Transform: View>(_ condition: Bool, @ViewBuilder transform: (Self) -> Transform) -> some View {
            if condition {
                transform(self)
            } else {
                self
            }
        }
    }
    

    【讨论】:

    • 谢谢,您能否详细说明您将如何使用它,例如将 .refreshable 添加到列表中?
    • @GarySabo 请参阅我答案顶部的示例。
    • 哦,我明白了,您正在使用.if(true) 作为一种黑客手段,以便能够将如果可用的检查嵌套在视图的主体内......非常聪明! ?
    猜你喜欢
    • 1970-01-01
    • 2019-06-27
    • 2021-05-05
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多