【问题标题】:SwiftUI - List - UIViewRepresantable won't be updatedSwiftUI - 列表 - UIViewRepresantable 不会更新
【发布时间】:2020-03-14 18:13:16
【问题描述】:

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

【问题讨论】:

  • 我运行了您的代码副本,当 UIViewRepresentable 仅在列表中查看时,一切正常
  • 确认问题。在版本 11.2.1 (11B500) 上测试。
  • 如果 List 替换为 ScrollView/ForEach 则正确更新,因此似乎是 List 的问题。
  • 是的,这不是答案或解决方案,而是缩小问题区域的调查结果。看起来(观察视图层次结构)问题恰恰出在重复使用的单元格中。
  • 在 Xcode 11.3 beta (11C24b) 上测试。现在更新了,但是……更新后,虽然是可见的,但是失去了前导填充,所以看起来有点难看。我建议提交雷达。

标签: swiftui


【解决方案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 - 不要将你的类命名为与系统一相同的名称,这可能会造成混淆和意想不到的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多