gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:31:48 26 4
gpt4 key购买 nike

是否可以制作 UIViewRepresentable View 需要 ViewBuilder参数处理动态内容,例如 ForEach循环?

我有以下 UIViewRepresentable我用来下拉到 UIKit 的 View 并获得一些定制 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))
}
}
}
}

但它因动态内容而失败,显示空白 View :

var body: some View {
CustomScrollView {
VStack {
ForEach(self.numbers) { number in
Text(String(number))
}
}
}
}

我明白这是因为当 makeUIView()被称为我的动态数据为空,稍后填充或更新。我评估我的 UIViewRepresentablecontent在 init 中,不要在 updateUIView() 中更新它.

您如何在 updateUIView() 中更新动态子内容?我 try catch @ViewBuilder参数为 @escaping每次关闭并评估它 updateUIView()被调用,这似乎是正确的解决方案(尽管效率低下?),但到目前为止还没有运气。

最佳答案

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

func updateUIView(_ uiView: UIView, context: Context) {}
你应该变异 uiView的 subview 直接与 content()更新答案:删除了带有协调器的解决方案,因为在某些情况下它不会按预期工作

关于ios - 如何使 UIViewRepresentable @ViewBuilder 处理动态内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62386390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com