Выбор ячейки табличного представления с несколькими флажками для добавления данных ячейки в один массив Swift 4.2? - PullRequest
0 голосов
/ 19 февраля 2019

Мой сценарий, я загрузил свои JSON данные в tableView с помощью codable.Здесь я добавил свою отметку tableView cell 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 голосов
/ 19 февраля 2019

Похоже, вы хотите иметь массив, содержащий все выбранные пользователи.Тогда вы должны иметь массив, подобный этому, который создается в объявлении класса:

var users:[Users] = []

Теперь вам нужно использовать протоколы swift, чтобы справиться с тяжелой работой за вас;это означает, что при удалении ранее выбранного пользователя из массива Users вам не нужен цикл for, а что-то более знакомое: содержит.

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)
}
0 голосов
/ 19 февраля 2019

Не используйте дополнительный массив, добавьте информацию selected в вашу модель.

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массив

let selectedUsers = users.filter{ $0.isSelected }
0 голосов
/ 19 февраля 2019

Вы можете попробовать

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

Тогда это массивИнтс, как и

 let res = item.map{ "\($0)" }.joined(separator: ",")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...