swiftui - SwiftUI - 列表 - UIViewRepresantable 不会更新
问题描述
在我的列表中,如果 UIViewRepresentable 是列表中的唯一项目,则不会更新它。如果我向它添加例如文本,它就可以工作。要查看效果,请再次向下和向上滚动。我究竟做错了什么?
她的是我的代码:
struct Test : UIViewRepresentable {
var text : String
func makeUIView(context: UIViewRepresentableContext<Test>) -> UILabel {
UILabel()
}
func updateUIView(_ uiView: UILabel, context: UIViewRepresentableContext<Test>) {
uiView.text = text
}
typealias UIViewType = UILabel
}
class Data : ObservableObject {
@Published var names = UIFont.familyNames
}
struct ContentView : View {
@EnvironmentObject var data : Data
var body: some View {
VStack {
List(data.names, id: \.self) { name in
Test(text: name)
// Text(name) // as soon as you comment this out, it works
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
解决方案
现在我知道可行的变体/解决方法(在所有可用的 Xcode 11.x 上测试)
var body: some View {
VStack {
List(data.names, id: \.self) { name in
Test(text: name).id(name) // << here !!
}
}
}
注意:在非常大的列表上可能会出现性能下降,但在大多数情况下,这并不显着。
PS:顺便说一下,关于class Data
- 不要用与系统一相同的名称来命名你的类,这可能会造成混淆和意想不到的问题。
推荐阅读
- html - 在这种情况下,我如何将按钮推到 CSS flexbox 的底部?
- php - Wordpress :: 需要通过 Wordpress 根文件夹中的额外 script.php 文件调用 Ajax Action
- firebase - Flutter Login 与 firebase 返回 ERROR_INVALID_EMAIL
- kotlin - 如何更简洁地重写这个 Kotlin 过滤器方法?
- opencl - 我可以在编译时检查 OpenCL 内核语法吗?
- php - 模块语言在 Prestashop 1.7.6 中不起作用
- prometheus - 如果 30 分钟内未更改,则返回指标值
- python - 比较两个 csv 文件,打印出 csv 中的差异,但如果差异打印全部同名
- c++ - 使用 Gtkmm 以编程方式在 Gtk::TextView 中选择文本
- android - Android:已安装的应用程序在主屏幕上没有图标