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

时间:2019-09-09 08:12:47

标签: ios swift swiftui xcode11

我有一个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>) {}
}

这可以按预期对目标起作用。

-问题:如何将计数传递给实时取景预览?

我尝试将计数传递给预览的初始化程序,如下所示,但它不起作用。我认为我应该以某种方式以count的形式通过Context

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

请注意,因为我需要多个预览,所以我不能 静态地makeUIView或{ {1}}。

2 个答案:

答案 0 :(得分:0)

将绑定变量添加到您的UIViewRepresentable

@Binding var count: String

然后更改updateUIView

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

答案 1 :(得分:0)

简单的包装器结构-类似于本机:

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类型您需要使用。