2017-01-20 9 views
0

Я создаю свою пользовательскую ячейку с UILabel и Button внутри. После подключения UIButton как действия в моем контроллере. Если прикоснуться к кнопке, она изменит изображение так, как оно предназначено, но то, что я хочу, - это то, что после касания измените обратную окраску UILabel. Как получить ссылку на мою пользовательскую ячейку.Как получить ссылку на ячейку от пользовательской функции

@IBAction func selectCell(_ sender: UIButton) { 
    if sender.imageView?.image == UIImage(named: "do") { 
     sender.setImage(UIImage(named: "done"), for: .normal) 
    } else { 
     sender.setImage(UIImage(named: "do"), for: .normal) 
    } 
} 
+1

Можете ли вы показать свое 'cellForRowAt indexPath' –

+1

' UIImage (названный: «делать») 'производит еще один новый экземпляр' UIImage' каждый раз, что всегда будет отличаться от вашего уже установлен образ. Следовательно, ваше состояние всегда будет падать в случае 'else'. –

ответ

1

Почему бы не использовать делегатскую систему? Это позволит вам легко получить ссылку на вашу ячейку.

В вас cell.swift

@objc protocol CellDelegate: class { 
    func buttonPressed(forCell cell: Cell) 
} 

Тогда в классе клеток: вы должны иметь свойство делегата, ваш метод IBAction и способ установить свой делегат:

class Cell { 

    fileprivate weak var delegate: CellDelegate? = nil 


    func setup(withDelegate delegate: CellDelegate) { 
     self.delegate = delegate 
    } 


    @IBAction func deleteButtonPressed(_ sender: Any) { 
     if sender.imageView?.image == UIImage(named: "do") { 
      sender.setImage(UIImage(named: "done"), for: .normal) 
     } else { 
      sender.setImage(UIImage(named: "do"), for: .normal) 
     } 

     delegate?.buttonPressed(forCell: self) 
    } 

} 

Наконец в вашем TableViewController: вам необходимо настроить делегата как самостоятельно во время конфигурации ячейки и реализовать метод делегирования:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cellIdentifier = viewModel.cellIdentifier(for: indexPath) 

     let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! Cell 

      cell.setup(withDelegate: self) 

     return cell 
    } 


extension: TableViewController: CellDelegate { 

    func buttonPressed(forCell cell: Cell) { 
     //Do what you want 
    } 

} 

Вот как я Tipically набор действий для клеток

+0

Спасибо, я полностью забыл о полномочиях делегатов :)) –