swift 将数组传递到列表初始化

q8l4jmvw  于 2023-01-19  发布在  Swift
关注(0)|答案(1)|浏览(146)

在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初始化器?

sirbozc5

sirbozc51#

您可以通过以下方式实现此目的:

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)")
}

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

相关问题