Dan*_*day 5 uikit ios swift swiftui
是否可以使UIViewRepresentable带有ViewBuilder参数的视图与循环等动态内容一起工作ForEach?
我有以下UIViewRepresentable视图,我\xe2\x80\x99m 使用它下拉UIKit并获取一些自定义UIScrollView行为:
struct CustomScrollView<Content:View>: UIViewRepresentable {\n\n private let content: UIView\n private let scrollView = CustomUIScrollView()\n\n init(@ViewBuilder content: () -> Content) {\n self.content = UIHostingController(rootView: content()).view\n self.content.backgroundColor = .clear\n }\n\n func makeUIView(context: Context) -> UIView {\n scrollView.addSubview(content)\n // ...\n return scrollView\n }\n\n func updateUIView(_ uiView: UIView, context: Context) {}\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n这适用于静态内容,如下所示:
\n\nvar body: some View {\n CustomScrollView {\n VStack {\n ForEach(1..<50) { number in\n Text(String(number))\n }\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n但动态内容失败,显示空白视图:
\n\nvar body: some View {\n CustomScrollView {\n VStack {\n ForEach(self.numbers) { number in\n Text(String(number))\n }\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我明白这是因为当makeUIView()调用时我的动态数据是空的,后来被填充或更新。我在 init 处评估我的UIViewRepresentable\xe2\x80\x99s content,并且不\xe2\x80\x99t 在updateUIView().
您如何更新 中的动态子内容updateUIView()?我尝试将@ViewBuilder参数捕获为@escaping闭包并在每次updateUIView()调用时对其进行评估,这似乎是正确的解决方案(尽管效率低下?),但到目前为止还没有运气。
@ViewBuilder 的评估失败,因为您在此处更改了结构的错误副本
func updateUIView(_ uiView: UIView, context: Context) {}
Run Code Online (Sandbox Code Playgroud)
您应该uiView直接使用 mutate 的子视图content()
更新的答案:删除了协调员的解决方案,因为在某些情况下它无法按预期工作
| 归档时间: |
|
| 查看次数: |
2619 次 |
| 最近记录: |