【发布时间】:2020-06-15 10:33:37
【问题描述】:
是否可以使带有ViewBuilder 参数的UIViewRepresentable 视图与ForEach 循环等动态内容一起使用?
我有以下UIViewRepresentable 视图,我用它来下拉到UIKit 并获得一些自定义UIScrollView 行为:
struct CustomScrollView<Content:View>: UIViewRepresentable {
private let content: UIView
private let scrollView = CustomUIScrollView()
init(@ViewBuilder content: () -> Content) {
self.content = UIHostingController(rootView: content()).view
self.content.backgroundColor = .clear
}
func makeUIView(context: Context) -> UIView {
scrollView.addSubview(content)
// ...
return scrollView
}
func updateUIView(_ uiView: UIView, context: Context) {}
}
这适用于静态内容,如下所示:
var body: some View {
CustomScrollView {
VStack {
ForEach(1..<50) { number in
Text(String(number))
}
}
}
}
但动态内容失败,显示空白视图:
var body: some View {
CustomScrollView {
VStack {
ForEach(self.numbers) { number in
Text(String(number))
}
}
}
}
我知道这是因为当makeUIView() 被调用时,我的动态数据是空的,稍后会被填充或更新。我在初始化时评估我的UIViewRepresentable 的content,而不是在updateUIView() 中更新它。
如何更新updateUIView() 中的动态子内容?我尝试将@ViewBuilder 参数捕获为@escaping 闭包并在每次调用updateUIView() 时对其进行评估,这似乎是正确的解决方案(尽管效率低下?),但到目前为止还没有运气。
【问题讨论】:
-
你应该看到这个github.com/Onaeem26/SwiftyUIScrollView。在这里,您可以看到如何通过“更新”处理动态内容。