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
,因此未排序的数组不会在更改之间短暂发布。)
直接在 View
的 body
中进行排序不是一个好主意,因为该块可能会在 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()
}
}
}
我正在用 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
,因此未排序的数组不会在更改之间短暂发布。)
直接在 View
的 body
中进行排序不是一个好主意,因为该块可能会在 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()
}
}
}