SwiftUI:根据@Published 变量对列表进行排序

SwiftUI: Sort list based on an @Published variable

我正在用 SwiftUI 构建一个 UI,并且我有一个用于构建 List 元素的数组。现在我想根据来自 @EnvironmentObject.

@Published 变量对该列表进行排序

方法一

我尝试让数组已经排序,将环境对象传递给排序方法:

List(getArraySorted(environmentObject)) { item in
    //do stuff with item
}

这将编译,但如果 environmentObject 更改,列表将不会更新。我也试过传入 environmentObject.variableToBaseSortOn 但无济于事。

方法二

我尝试在 Swift UI:

中对数组进行内联排序
List(array.sorted(by: { (lhs, rhs) -> Bool in
    // do sorting based on self.environmentObject
})) { item in
    // do stuff with item
}

这将编译,但会崩溃:

Fatal error: No ObservableObject of type EnvironmentObjectClass found.
A View.environmentObject(_:) for EnvironmentObjectClass may be missing as an ancestor of this view.

崩溃中的提示不正确,设置了 environmentObject 并且 self.environmentObject 设置为正确的对象。

您最好的方法可能是每次使用 属性 观察器对 ObservableObject 内的列表进行排序,然后手动将更改通知 ObservableObject 发布者(而不是使用 @Published,因此未排序的数组不会在更改之间短暂发布。)

直接在 Viewbody 中进行排序不是一个好主意,因为该块可能会在 SwiftUI 呈现时被调用很多次(这对我们来说是透明的,因为开发商)。我怀疑这可能是方法 2 不起作用的原因。

例如:

import Combine

class SomeObject: ObservableObject {

    // or whatever data type you need...
    var array: [String] {
        didSet {
            array.sort(by: { (lhs, rhs) -> Bool in
                // do sorting based on self.environmentObject
            })
            objectWillChange.send()
        }
    }

}