我在macOS的CoreData应用程序中使用了Table
@FetchRequest(sortDescriptors: [NSSortDescriptor(key: "name", ascending: true)]) private var categories: FetchedResults<Categories>
@State private var selectedCategoryID: Categories.ID?
,我想知道我如何能捕获选定行的变化。如果我尝试。onchange()如下所示,那么由于错误,代码无法编译&不能调用非函数类型的值'Categories.ID?'(又名'Optional
Table(categories, selection: $selectedCategoryID) {
TableColumn("Name", value .name!)
TableColumn("Type", value: .type!)
}.onChange(of: selectedCategoryID {
print("Selected row changed.")
}
谢谢。
我终于找到了根本原因。onchange()必须看起来像
.onChange(of: selectedCategoryID) { selected in
print("Selected row is (selected)")
}
onChange
是"触发副作用",例如不相关的东西。如果你想要更新一个相关的值,那么一个技巧就是将它移动到一个带有一些逻辑的结构体中,例如
struct TableConfig {
var selectedCategoryID: CategoryID? {
didSet {
counter++
}
}
var counter = 0
mutating func reset() {
selectedCategoryID = nil
counter = 0
}
}
...
@State var config = TableConfig()
...
Table(categories, selection: $config.selectedCategoryID)