【问题标题】:How to modify UIView properties for SwiftUI preview?如何修改 SwiftUI 预览的 UIView 属性?
【发布时间】:2019-09-09 08:12:47
【问题描述】:

我有一个UIView,带有 2 个标签和一个用于绑定的变量,如下所示:

var count: String? {
    get { viewCountLabel.text }
    set {
        viewCountLabel.text = newValue
        viewsTitleLabel.text = newValue == "1" ? "View" : "Views"
    }
}

还有一个convenience init 喜欢:

convenience init(count: String) {
    self.init()
    self.count = count
}

此视图符合UIViewRepresentable,如下:

extension ViewCountView: UIViewRepresentable {
    typealias UIViewType = ViewCountView

    func makeUIView(context: Context) -> UIViewType {
        UIViewType(frame: .zero)
    }

    func updateUIView(_ uiView: UIViewType, context: UIViewRepresentableContext<UIViewType>) {}
}

这在目标上按预期工作。

- 问题:我应该如何将计数传递给实时视图中的预览?

我尝试像下面这样在预览的初始化程序上传递计数,但它不起作用。我想我应该以某种方式以Context 的形式传递count

struct ViewCountView_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            ViewCountView(count: "0")
            ViewCountView(count: "12m")
            ViewCountView(count: "41234")
    }
}

请注意因为我需要超过 1 个预览,我不能makeUIViewupdateUIView静态写入值.

【问题讨论】:

    标签: ios swift xcode swiftui xcode11


    【解决方案1】:

    将绑定变量添加到您的UIViewRepresentable

    @Binding var count: String
    

    那就改updateUIView:

    func updateUIView(_ uiView: UIViewType, context: UIViewRepresentableContext<UIViewType>) {
        uiView.count = count
    }
    

    【讨论】:

      【解决方案2】:

      简单的包装结构 - 像本地人一样工作:

      struct <#NameOfTheWrapperView#>: UIViewRepresentable {
      
          typealias TheUIView = <#AnyUIView#>
          var configuration = { (view: TheUIView) in }
      
          func makeUIView(context: UIViewRepresentableContext<Self>) -> TheUIView { TheUIView() }
          func updateUIView(_ uiView: TheUIView, context: UIViewRepresentableContext<Self>) {
              configuration(uiView)
          }
      }
      

      ? 完全可定制

      ResponderTextField() {
          $0.backgroundColor = .red
          $0.tintColor = .blue
      }
      

      所以$0 指向确切的类型,并且可以按照您最初在UIKit 中的任何方式进行编辑。


      注意我把它做成了gist,所以你可以很容易地把它复制粘贴到你的代码中,只需要命名它并定义你需要使用的原始UIView类型.

      【讨论】:

      • 在这个例子中,你会把$0.backgroundColor等放在哪里?
      • 如上例中的configuration 参数。注意最后一个参数是一个函数,可以写成一个尾随闭包。
      • 那么我会只使用每个参数的配置吗?例如,假设我需要将几个值传递给我的 UIView。所以配置(uiView.value1)>新行>配置(uiView.value2)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多