如何使 UIViewRepresentable @ViewBuilder 处理动态内容?

Dan*_*day 5 uikit ios swift swiftui

是否可以使UIViewRepresentable带有ViewBuilder参数的视图与循环等动态内容一起工作ForEach

\n\n

我有以下UIViewRepresentable视图,我\xe2\x80\x99m 使用它下拉UIKit并获取一些自定义UIScrollView行为:

\n\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这适用于静态内容,如下所示:

\n\n
var body: some View {\n    CustomScrollView {\n        VStack {\n            ForEach(1..<50) { number in\n                Text(String(number))\n            }\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但动态内容失败,显示空白视图:

\n\n
var body: some View {\n    CustomScrollView {\n        VStack {\n            ForEach(self.numbers) { number in\n                Text(String(number))\n            }\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我明白这是因为当makeUIView()调用时我的动态数据是空的,后来被填充或更新。我在 init 处评估我的UIViewRepresentable\xe2\x80\x99s content,并且不\xe2\x80\x99t 在updateUIView().

\n\n
\n\n

您如何更新 中的动态子内容updateUIView()?我尝试将@ViewBuilder参数捕获为@escaping闭包并在每次updateUIView()调用时对其进行评估,这似乎是正确的解决方案(尽管效率低下?),但到目前为止还没有运气。

\n

Ale*_*kin 2

@ViewBuilder 的评估失败,因为您在此处更改了结构的错误副本

func updateUIView(_ uiView: UIView, context: Context) {}
Run Code Online (Sandbox Code Playgroud)

您应该uiView直接使用 mutate 的子视图content()

更新的答案:删除了协调员的解决方案,因为在某些情况下它无法按预期工作