2016-12-08 4 views
3

Я хочу изменить изображение последней ячейки, если пользователь нажмет на новую ячейку. На данный момент им это сделать:Вызов последней ячейки в TableView

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

     //Old Cell Image 
     let lastCell = tableView.cellForRow(at: self.lastCell) as! DataTableViewCell!; 
     lastCell?.imageButton.image = UIImage(named: "RadioButtomDeactive.png") 

     let indexPathCel = tableView.indexPathForSelectedRow; 
     let currentCell = tableView.cellForRow(at: indexPathCel!) as! DataTableViewCell!; 

     dateSelected = currentCell?.dateSession.text 
     currentCell?.imageButton.image = UIImage(named: "RadioButtom.png") 

    } 

Я пытался спасти indexPath.row в lastCell (то есть целое), но он не работает, так как cellForRow только принимают indexPath.

+0

Просто создайте NSIndexPath для последней виолончели и используйте ее для ссылки на последнюю ячейку.NSIndexPath (forRow: 2, inSection: 0), просто замените фиксированное число 2 здесь на ваш счет источника данных – Lefteris

+0

Да, это было простое решение , не знал, как я мог этого не видеть. – Adrian

ответ

3

Вы можете просто создать IndexPath используя ваш хранится lastCell через:

IndexPath(row: self.lastCell, section: 0) 

Если есть больше чем один раздел, вам просто нужно будет вставить свой последний раздел вместо 0.

+0

Да, это решает проблему. Спасибо, dervs! – Adrian

2

Почему вы не храните в памяти IndexPath вместо Int?

или

вы можете создать IndexPath из вашего Int с

IndexPath(row: Int, section: Int) 
+0

Thats it, Anthony! Большое вам спасибо. – Adrian

1

У меня есть совсем другое решение.

var selectedIndexPath: IndexPath? 

override func tableView(_ tableView: UITableView, 
         cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{ 
    ... 
    if indexPath == selectedIndexPath { 
     cell.imageButton.image = UIImage(named: "RadioButtom.png") 
    } else { 
     cell.imageButton.image = UIImage(named: "RadioButtomDeactive.png") 
    } 
    ... 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    selectedIndexPath = indexPath 

    if let visibleIndexPaths = tableView.indexPathsForVisibleRows { 
     tableView.reloadRows(at: visibleIndexPaths, with: .none) 
    } 
} 

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

+0

Это очень хорошее решение, но я не понимаю, почему бы мне перезагрузить все строки, если бы я мог просто сохранить индексную ячейку текущей ячейки и использовать ее, когда пользователь нажимает на другую. – Adrian

+0

@Adrian Вы не перезагружаете все строки, только видимые. Ответ почему нет? Там будет только ручная работа видимых строк, поэтому производительность не пострадает. Кроме того, вся логика того, как выглядят ячейки, хранится в ячейке для строки по указательному пути. –

+0

Вижу. Это действительно очень элегантное решение. – Adrian