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

Posted

技术标签:

【中文标题】如何修改 SwiftUI 预览的 UIView 属性?【英文标题】:How to modify UIView properties for SwiftUI preview? 【发布时间】: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静态写入值.

【问题讨论】:

【参考方案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)

以上是关于如何修改 SwiftUI 预览的 UIView 属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何修改拖放预览SwiftUI的背景颜色和形状?

如何在 SwiftUI 视图中访问 UIView 子类的属性?

如何与代码并排打开 SwiftUI 预览? [复制]

如何在 SwiftUI 中使用 UIViewController 和 UIView?

如何解决“SwiftUI 无法更新预览”问题?

SwiftUI 视图,如 UIKit UIView,如何更改图像的大小