2016-11-26 2 views
0

Прямо сейчас, когда я нахожу левую кнопку на ячейке, чтобы показать «любимую» кнопку, и щелкните по ней, на случайной ячейке вместо ярлыка, на который я надавил, появляется метка «Избранное». Как заставить ярлык «Избранное» появляться/исчезать в правой ячейке, когда я нажимаю на назначенную кнопку?Как назначить ярлык определенной ячейке?

Сейчас мой код в функции editActionsForRowAt является:

internal func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell 

    let favorite = UITableViewRowAction(style: .normal, title: "Favorite") { action, index in 
     cell.favoriteLabel.text = "Favorite" 
     tableView.reloadRows(at: [indexPath], with: .none) 
    } 
    favorite.backgroundColor = UIColor.orange 

    return [favorite] 
} 

Проблема установки «favoriteLabel» = «Фаворит» не устанавливает «favoriteLabel» правой ячейки в «Избранные»

+2

** Никогда никогда не создавайте повторно используемую ячейку вне 'cellForRowAtIndexPath'. Обновите модель (массив источников данных) и перезагрузите строку или весь вид таблицы. – vadian

+0

@vadian, как я могу убедиться, что он обновляет правильную ячейку, хотя (это моя проблема). Также, как еще я могу получить доступ к своей «любимойLabel», если моя ячейка создана в другой функции? –

+0

Используйте метод cellForRow (at:) 'вместо' dequeueReusableCell (withIdentifier: for:) ' – rmaddy

ответ

1

Вы здесь ошибаетесь. Вместо прямого обновления ячейки вам необходимо обновить модель данных, а затем перезагрузить ячейку по пути индекса. Затем ваш cellForRowAt правильно отобразит обновленную ячейку на основе обновленной модели данных.

У вас на самом деле странное сочетание двух. Вы (неправильно) пытаетесь получить ячейку, затем установите ее метку, а затем перезагрузите эту строку. Не делай того и другого. Просто обновите модель данных, а затем перезагрузите строку. Вот и все.

Как ни в стороне, никогда не звоните dequeueReusableCell за пределами cellForRowAt:. Если вы настаиваете на своем текущем подходе (который, вероятно, не будет работать должным образом после прокрутки), вам необходимо заменить вызов на dequeueReusableCell вызовом cellForRow(at:).

+0

Спасибо! Это немного облегчило комментарии. Попробуете первый подход –

+0

, что именно вы подразумеваете под моей «моделью данных»? –

+0

Данные, используемые источником данных вашего представления таблицы для заполнения таблицы. Ваш массив (или любые данные), которые вы используете в своих 'cellForRowAt' и' numberOfRowsInSection'. – rmaddy

Смежные вопросы