在iOS 16中,List
有一个带有editActions
参数的新初始化器,它允许您将editActions
与EditButton()
一起使用,而不是使用.onMove, .onDelete
等几个修饰符。
struct QuestionView: View {
@State
private var data: [Int] = Array(1...100)
@State
private var searchQuery: String = ""
var filteredData: [Int] {
switch searchQuery.isEmpty {
case true: return data
case false: return data.filter { $0.description.contains(searchQuery) }
}
}
var body: some View {
NavigationStack {
// New init take a $data: Binding<[Int]>
// i can’t pass filteredData: [Int]
List($data, id: .self, editActions: .all) {
// List(filteredData, id: .self) {
Text("($0.wrappedValue)")
}
.navigationTitle("Example")
.searchable(text: $searchQuery)
.toolbar { EditButton() }
}
}
}
如何保存搜索功能(传递filteredData
)并将绑定传递给新的List
初始化器?
可以这样做:
var filteredData: Binding<[Int]> {
Binding {
if searchQuery.isEmpty {
return data
}
return data.filter { $0.description.contains(searchQuery) }
} set: { newData in
if searchQuery.isEmpty {
data = newData
} else {
// But what do you want to happen here?
}
}
}
,然后……
List(filteredData, id: .self, editActions: .all) {
Text("($0.wrappedValue)")
}
问题是,当编辑过滤后的原始数据(重新排序或删除项)时会发生什么?