为啥我的绑定 [String] 不会更改我的多选列表 SwiftUI

Posted

技术标签:

【中文标题】为啥我的绑定 [String] 不会更改我的多选列表 SwiftUI【英文标题】:Why won't my bound [String] not change my multi-select list SwiftUI为什么我的绑定 [String] 不会更改我的多选列表 SwiftUI 【发布时间】:2019-11-21 21:53:00 【问题描述】:

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

    @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】:

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

我不知道你的其余代码是如何设置的,所以很遗憾我无法提示你任何事情。

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

我希望这有助于澄清事情。

【讨论】:

以上是关于为啥我的绑定 [String] 不会更改我的多选列表 SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章

使用背景更改的多选列表视图

ElementUI 将table多选框改为单选框的解决办法

ExtJS--grid表格前多选列

用JS自制表格软件玩数据6. 单元格的多选

用JS自制表格软件玩数据6. 单元格的多选

Delphi 6中绑定到数据库的多选列表框