SwiftUI-列表-UIViewRepresantable将不会更新

时间:2019-11-19 09:18:18

标签: swiftui

在我的列表中,如果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()
    }
}

1 个答案:

答案 0 :(得分:1)

目前,我知道可以使用的变体/解决方法(已在所有可用的Xcode 11.x上进行了测试)

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

注意:在很大的列表上可能是性能下降,但是在大多数情况下并不明显。

PS:顺便说一下,大约class Data-不要用与系统一相同的名称来命名您的类,否则可能会造成混乱和不可预期的问题。