Как я могу ссылаться на UITableViewCell при нажатии на кнопку из UICollectionViewCell? - PullRequest
0 голосов
/ 23 сентября 2019

Tapping on UICollectionViewCell Button

У меня есть UICollectionView и UITableView в UIViewController.Выбор строк в UITableView добавляет элементы в UICollectionView и таким же образом отменяя выбор строк в UITableView, удаляет элементы из UICollectionView.Это делается путем добавления / удаления объекта UITableView в массив его класса.Если таблица была выбрана (пользователь был добавлен в массив), accessoryType для этой ячейки изменится на галочку, а когда пользователь будет удален, он вернется к нулю.

var selectedUsers = [User]()

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let cell = tableView.cellForRow(at: indexPath) as? NewGroupUserTableViewCell {
            if tableView.cellForRow(at: indexPath)?.accessoryType == .checkmark {
                tableView.cellForRow(at: indexPath)?.accessoryType = .none
                if let user = cell.user {
                    self.selectedUsers.removeAll{$0.uid == user.uid}
                }
            } else {
                tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
                    if let user = cell.user {
                        self.selectedUsers.append(user)
                    }
            }
            self.collectionView.reloadData()
        }
    }

В классе UICollectionViewCell, который у меня естьпротокол для вызова функции в UIViewController при нажатии кнопки удаления.При каждом нажатии кнопки удаления пользователь удаляется из массива, поэтому удаляет элемент из UICollectionView.Проблема, с которой я сталкиваюсь, заключается в обновлении accessoryType в UITableViewCell при нажатии кнопки удаления в UICollectionViewCell.Я не знаю, как ссылаться на конкретный UITableViewCell из UICollectionView.

Лучший способ, с помощью которого я могу придумать, - это цикл for для UITableViewCells, который ищет объект с совпадающим идентификатором, а затем обновляет accessoryType, еслисовпадение найдено.Это не всегда работает.

Вот функция в моем делегате класса UICollectionViewCell.

func didTapDelete(user: User) {
    let selectedUser = selectedUsers.first(where: { $0.uid == user.uid })
    for section in 0 ..< 2 {
        let rowCount = tableView.numberOfRows(inSection: section)

        for row in 0 ..< rowCount {
            let cell = tableView.cellForRow(at: NSIndexPath(row: row, section: section) as IndexPath) as! NewGroupUserTableViewCell
            if cell.user.uid == selectedUser?.uid {
                cell.accessoryType = .none
            }
        }
    }

    selectedUsers.removeAll{$0.uid == user.uid}
    self.collectionView.reloadData()
}

Как я могу ссылаться на UITableViewCell при нажатии на кнопку из UICollectionViewCell?

1 Ответ

1 голос
/ 23 сентября 2019

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

В вашем cellForRowAt методе doкак показано ниже, переместите обновление стиля выделения в этот метод:

func tableView(_ tableView: UITableView,
               cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "NewGroupUserTableViewCell",
                                             for: indexPath) as! NewGroupUserTableViewCell
    let user = users[indexPath.row]
    cell.textLabel?.text = user.uid // Whatever your want to show here, Did this for sample
    if itemsSelected.contains(user) {
        cell.accessoryType = .checkmark
    } else {
        cell.accessoryType = .none
    }
    return cell
}

В методе делегата UICollectionViewCell выполните следующие действия: Здесь яЯ добавляю еще один параметр, чтобы передать ячейку обратно.

func didTapOnDelete(_ cell: ItemCollectionViewCell, item: User) {
    guard let indexPath = collectionView.indexPath(for: cell) else { return }
    if let index = itemsSelected.firstIndex(of: item) {
        itemsSelected.remove(at: index)
    } else {
        itemsSelected.append(item)
    }
    collectionView.deleteItems(at: [indexPath])
    tableView.reloadData()
}

И ваш didSelectRowAt будет выглядеть следующим образом:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let userToAdd = users[indexPath.row]
    if let index = itemsSelected.firstIndex(of: userToAdd) {
        itemsSelected.remove(at: index)
    } else {
        itemsSelected.append(userToAdd)
    }
    collectionView.reloadData()
    tableView.reloadRows(at: [indexPath], with: .automatic)
}

Примечание : Для удобства сравнения я сделал класс пользователя Уравненный , как показано ниже:

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

Также предполагается, что этот же элемент не может многократно добавляться в collectionView.

Надеюсь, это поможет! .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...