传递数组到List init



在iOS 16中,List有一个带有editActions参数的新初始化器,它允许您将editActionsEditButton()一起使用,而不是使用.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)")
}

问题是,当编辑过滤后的原始数据(重新排序或删除项)时会发生什么?

最新更新