【问题标题】:selecting multiple items from the list and changing their color in SwiftUI从列表中选择多个项目并在 SwiftUI 中更改它们的颜色
【发布时间】:2020-11-27 23:59:05
【问题描述】:

我正在寻找一种与此类似的方法来解决此问题。有可能吗?

单品没问题。所选项目将在我自己的颜色“listTextColor”的其余部分为白色。但是,是否有可能以类似的方式将“selectedItems”数组中选择和保存的元素显示为白色,其余部分显示为不同的颜色?

示例代码:

 @State var recordArray: Array = arrayRecords
 @State var selectedItems: Array = []
 @State var selections: String?

List() {
                            ForEach(self.recordArray, id: \.self) { record in
                                Text(record)
                                    .onTapGesture {
                                        self.selections = record
                                        self.selectedItems.append(record)
                                        
                                }
                                .foregroundColor(self.selections == record ? Color(.white) : Color(self.listTextColor2))
                            }
                        }

【问题讨论】:

  • 将 record.id 添加/删除到 selectedItems 并检查当前记录 id 是否在数组中。

标签: ios arrays list text swiftui


【解决方案1】:

最好的办法是使用视图模型而不是纯字符串,并在其中使用标志来为行着色。

struct ContentView: View {
    @State var recordArray: [RecordItem]
    
    var body: some View {
        List() {
            ForEach(0..<self.recordArray.count, id: \.self) { i in
                VStack {
                    Text(self.recordArray[i].title)
                }
                .border(Color.black)
                .onTapGesture {
                    self.recordArray[i].isSelected.toggle()
                    self.recordArray[i] = self.recordArray[i]
                }
                .foregroundColor(self.recordArray[i].isSelected ? Color(.red) : Color(.green))
            }
        }
    }
}


class RecordItem {
    var title = ""
    var isSelected = false
}

【讨论】:

  • 但它将为列表中的所有文本着色。我只想为“录音”项目着色。那么它应该看起来像 List 中的脸颊。
  • 上面的代码只为被点击的项目着色。你试过了吗?
  • 我找到了解决这个问题的其他方法。
【解决方案2】:

我找到了这个问题的答案。

 @State var recordArray: Array = arrayRecords
 @State var selectedItems: Array = []
 @State var selections: String?

var body: some View {
List() {
                            ForEach(self.recordArray, id: \.self) { record in
                                Text(record)
                                    .onTapGesture {
                                                                                   if self.selectedItems.first(where: { $0 as! String == record } ) != nil {
                                            self.selectedItems.removeAll(where: { $0 as! String == record } )
                                        } else {
                                            self.selectedItems.append(record)
                                        }
                                        
                                }
                                .foregroundColor((self.selectedItems.first(where: { $0 as! String == record } ) != nil) ? Color(.white) : Color(self.listTextColor2))
                            }
                        }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-27
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    相关资源
    最近更新 更多