为什么我的绑定[String]不能更改我的多选列表SwiftUI

时间:2019-11-21 21:53:00

标签: list swiftui

我正在尝试创建一个多选列表:

    @Binding var selection:[String]


List {
            ForEach(self.items, id: \.self) { item in
                MultipleSelectionRow(title: item, isSelected: self.selection.contains(item)) {
                    if self.selection.contains(item) {
                        self.selection.removeAll(where: { $0 == item }) <=== NO AFFECT
                    }
                    else {
                        self.selection.append(item). <=== NO AFFECT
                    }
                    self.queryCallback()

                }
            }//ForEach
                .listRowBackground(Color("TPDarkGrey"))
        }//list

我有一行,它是调用上述操作的按钮

struct MultipleSelectionRow: View {
    var title: String
    var isSelected: Bool
    var action: () -> Void

    var body: some View {

        Button(action: self.action) {
            HStack {
                Text(self.title)
                Spacer()

                if self.isSelected {
                    Image(systemName: "checkmark")
                }
            }
            .font(.system(size: 14))
        }
    }
}

为什么它不追加或远程绑定数组中的项目?通过视图,似乎第二次改变了

1 个答案:

答案 0 :(得分:1)

我设法从您的代码中产生了一个有效的示例:

我不知道其余代码的设置方式,因此很遗憾,我无法提示您任何内容。

struct MultipleSelectionRow: View {
    var title: String
    var isSelected: Bool
    var action: () -> Void

    var body: some View {

        Button(action: self.action) {
            HStack {
                Text(self.title)
                Spacer()

                if self.isSelected {
                    Image(systemName: "checkmark")
                }
            }
            .font(.system(size: 14))
        }
    }
}

struct ContentView: View {
    @State var selection:[String] = []
    @State var items:[String] = ["Hello", "my", "friend", "did", "I", "solve", "your", "question", "?"]

    var body: some View {
        List {
            ForEach(self.items, id: \.self) { item in
                MultipleSelectionRow(title: item, isSelected: self.selection.contains(item)) {
                    if self.selection.contains(item) {
                        self.selection.removeAll(where: { $0 == item })
                    }
                    else {
                        self.selection.append(item)
                    }

                }
            }
            .listRowBackground(Color("TPDarkGrey"))
        }
    }
}

我希望这有助于澄清问题。