首页 > 解决方案 > 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()
    }
}

标签: swiftui

解决方案


现在我知道可行的变体/解决方法(在所有可用的 Xcode 11.x 上测试)

var body: some View {
    VStack {
        List(data.names, id: \.self) { name in
            Test(text: name).id(name) //           << here !!
        }
    }
}

注意:在非常大的列表上可能会出现性能下降,但在大多数情况下,这并不显着。

PS:顺便说一下,关于class Data- 不要用与系统一相同的名称来命名你的类,这可能会造成混淆和意想不到的问题。


推荐阅读