Измените только одну конкретную высоту строки tableView

Я ищу способ изменить определенную строку в моем tableView.

Я использую уведомление, чтобы проверить, когда я делаю действие в своей ячейке. Согласно ответу, моя цель - отобразить следующую строку.

По умолчанию моя ячейка имеет это свойство.

if (indexPath.row == 5){
    tableView.rowHeight = 0.0
}

if (indexPath.row == 6){
    tableView.rowHeight = 0.0
}

return cell

Моя цель, когда я нахожусь в своем уведомлении, - изменить значение высоты строки для пятой строки.

спасибо за помощь


person noxo.    schedule 10.02.2020    source источник
comment
Спасибо, но нет, потому что я хотел бы изменить высоту строки непосредственно из моего уведомления, а не в функции tableView   -  person noxo.    schedule 11.02.2020
comment
Вам нужно изменить строку ячейки при нажатии?   -  person Nagarjun    schedule 11.02.2020
comment
Да, это моя цель. В моем приложении я использую элементы радио, поэтому, если я выбираю один конкретный элемент, я хочу отобразить следующий.   -  person noxo.    schedule 11.02.2020


Ответы (1)


Для этого вы можете использовать Set<IndexPath> и ваши методы делегата tableView.

Скажем, у вас есть набор выбранных индексных путей selectedIndexPaths и высот largeHeight и normalHeight. Ваша функция heightForRow может выглядеть так:

func tableView(_ tableView: UITableView, heigthForRowAt indexPath: IndexPath) -> CGFloat {
    guard !selectedIndexPaths.contains(indexPath) else {
        return largeHeight
    }

    return normalHeight
}

Затем вы можете динамически изменить высоту следующим образом:

/// Convenience method for selecting an index path
func select(indexPath: IndexPath, completion: ((Bool) -> Void)? = nil){
    selectedIndexPaths.insert(indexPath)
    tableView.performBatchUpdates({
        self.tableView.reloadRows(at: [indexPath], with: .none)
    }, completion: completion)
}

В вашем делегате tableView вы можете вызвать этот метод в didSelect:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    select(indexPath: indexPath)
}

Сделайте то же самое, если у вас есть метод, отвечающий на ваше уведомление (при условии, что вы поместили свой indexPath в userInfo вашего уведомления под ключом «indexPathKey»):

func notifiedShouldEnlargeRow(aNotification: Notification) {
    guard let indexPath = aNotification.userInfo["indexPathKey"] as? IndexPath else { return }
    select(indexPath: indexPath)
}

Для справки см. performBatchUpdates(_:completion) и reloadRows(at:with:).

person kid_x    schedule 10.02.2020
comment
Не весь код был необходим, но я нашел решение с помощью self.tableView.reloadRows(at: [indexPath], with: .none) Спасибо. - person noxo.; 12.02.2020
comment
Просто подумал, что я бы бросил полный рабочий пример. :) Рад, что это помогло! - person kid_x; 12.02.2020