如何为 SwiftUI 预览修改 UIView 属性?

How to modify UIView properties for SwiftUI preview?

我有一个 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.

将绑定变量添加到您的 UIViewRepresentable:

@Binding var count: String

然后更改updateUIView

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

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

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() {
    [=11=].backgroundColor = .red
    [=11=].tintColor = .blue
}

因此 [=12=] 指向确切的类型,并且可以像最初在 UIKit 中那样进行编辑。


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