Tableview单元格多个复选标记选择以将单元格数据添加到单个数组中Swift 4.2?

时间:2019-02-19 18:21:14

标签: ios swift uitableview

我的情况是,我已经在JSON的帮助下将tableView数据加载到codable中。在这里,我添加了tableView单元格multiple选中标记和deselect。现在,如果我选择tableView单元格,我可以获取cell数据,但是我想在一个array中添加数据,如果我取消选择单元格,则应该从数组中remove进行添加。所选单元格数据我要移至另一个ViewController。我想知道该怎么做。

我的代码

// method to run when table view cell is tapped
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("You tapped cell number \(indexPath.row).")

        if let cell = tableView.cellForRow(at: indexPath as IndexPath) {
            if cell.accessoryType == .checkmark {
                cell.accessoryType = .none
            } else {
                cell.accessoryType = .checkmark
                let item = users[indexPath.row]
                print(item) // here printing cell selection data 
            }
        }
    }

“我的小区选择”当前输出

You tapped cell number 1.
User(userId: "121”, active: 1, name: example_table.Name(firstname: "jack", lastname: "m"))
You tapped cell number 2.
User(userId: "122”, active: 1, name: example_table.Name(firstname: “rose”, lastname: “h”))
You tapped cell number 3.
User(userId: "123”, active: 1, name: example_table.Name(firstname: “makj”, lastname: “i”))

3 个答案:

答案 0 :(得分:0)

您可以尝试

var selectedArr = [Item]()
var users = [Item]()

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print("You tapped cell number \(indexPath.row).")
    let item = users[indexPath.row]
    if let cell = tableView.cellForRow(at: indexPath) { // you can also omit the if let and force-unwrap as in this case cell will never be nil 
        if cell.accessoryType == .checkmark {
            cell.accessoryType =  .none
            selectedArr.remove(where:{ $0 == item })
        } else {
            cell.accessoryType = .checkmark
            selectedArr.append(item)
        }
    }
}

然后在cellForRowAt

let cell = ////
let item = users[indexPath.row]
cell.accessoryType = selectedArr.contains(item) ? .checkmark : .none

还要确保名为Item的模型符合Equatable


给予

  for (index, element) in item.enumerated() { 
     print("Item \(index): \(element)")
  }

给出

  

项目0:121,项目1:122,项目2:123

然后它是一个Ints数组,所以做

 let res = item.map{ "\($0)" }.joined(separator: ",")

答案 1 :(得分:0)

因此,听起来您希望能够拥有一个包含所有选定用户的数组。然后您要做的就是在类声明中实例化一个这样的数组:

var users:[Users] = []

现在您应该做的是利用swift的协议来为您处理繁重的工作;意思是,当从Users数组中删除先前选择的用户时,您不需要for循环,而是需要更熟悉的东西:contains。

extension User: Equatable {
    static func == (lhs: User, rhs: User) -> Bool {
        return lhs.userId == rhs.userId
    }
}

因此,现在您可以在删除或添加时调用它,例如:

var thisUser = User(userId: "123”, active: 1, name: example_table.Name(firstname: “makj”, lastname: “i”))

if users.contains(thisUser) {
    users.removeAtIndex(users.indexOf(thisUser))
} else {
    //Add the user to the array here for example
    users.append(thisUser)
}

答案 2 :(得分:0)

不要使用额外的数组,只需将选定的信息添加到模型中即可。

get idNumber() {
    if (this.identificationForm) {
      return this.identificationForm.get('idNumber') as FormControl;
    }
}

假设数据源数组声明为struct User : Codable { var isSelected = false // ... other members } ,则根据users中的isSelected值设置选中标记

cellForRowAt

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) let user = users[indexPath.row] cell.accessoryType = user.isSelected ? .checkmark : .none ... } 中,只需切换didSelectRowAt并重新加载行

isSelected

要获取所有选定的用户,只需override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { users[indexPath.row].isSelected.toggle() tableView.reloadRows(at: [indexPath], with: .none) } 阵列

filter