如何修改 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 个预览,我不能在makeUIView
或updateUIView
内静态写入值.
【问题讨论】:
【参考方案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 视图中访问 UIView 子类的属性?