表未正确更新

时间:2021-06-28 18:15:23

标签: swift macos swiftui

我正在尝试使用新的 Table 来显示一些带有单列的排序数据,但是我遇到了当项目消失时它没有更新的问题。用一个简单的 List 替换它就足够奇怪了。

复制:

  1. 确保已安装 macOS Montery(测试版 1 或 2)和 Xcode 13 Beta 2
  2. 针对 macOS 创建一个新的空白 SwiftUI 项目,其部署目标设置为 12.0
  3. 粘贴以下代码:
struct ContentView: View {
    @State var data: [TestStruct] = []
    
    var sortedData: [TestStruct] {
        return data.sorted(by: { $0.text < $1.text })
    }
    var body: some View {
        Table(sortedData) { // Swapping this with a List fixes everything
            TableColumn("Text", value: \.text)
        }
        .toolbar {
            Button(action: {
                addItem(longString: false)
            }) {
                Text("Add Short")
            }
            Button(action: {
                addItem(longString: true)
            }) {
                Text("Add Long")
            }
        }
    }
    private func addItem(longString: Bool) {
        withAnimation {
            data.append(TestStruct(text: longString ? "This is long so you can differentiate better" : "Short"))
        }
    }
}
struct TestStruct: Identifiable {
    var text: String
    var id = UUID()
}
  1. 运行应用程序,然后按“加长”按钮。这只是添加一个具有长字符串的项目。
  2. 不滚动,垃圾邮件点击“添加简短”按钮。添加足够的项目,以便您之前添加的长字符串超出窗口,再加上一些项目。
  3. 完成后,滚动表格,您应该会看到重复的长字符串,即使您只添加了一个

是什么导致了这个问题?将 Table 替换为 List 完全解决了问题,但我想保留 Table(以便稍后添加更多列)。

另外,有没有其他人能够重现这个问题?我已经能够使用 Xcode 13 Beta 2 在两个版本的 macOS Montery(测试版 1 和 2)上进行复制

1 个答案:

答案 0 :(得分:0)

我可以重现这一点,对我来说,这看起来像是一个由这么多行相同引起的错误。

例如,我可以通过更改 addItem 使每个文本值唯一来完全消除此错误:

let count = data.count + 1
data.append(TestStruct(text: 
     longString ? "This is long so you can differentiate better \(count)" : "Short \(count)"))

要注意的另一件事是,如果您向表格添加排序,则单击排序箭头将解决问题,重复项将消失。所以这看起来是一个明显的错误,但我们仍处于早期测试阶段,所以它不会阻止我在我的 macOS 项目中使用 Table 并且这有点人为,因为有这么多行具有完全相同的值。

相关问题