2017-01-20 5 views
0

Ich erstelle meine benutzerdefinierte Zelle mit UILabel und Button innerhalb. Nachdem ich den UIButton als Aktion in meinem Controller verbunden habe. Wenn Sie den Button auffrischen, ändert sich das Bild wie vorgesehen, aber was ich will ist, dass nach der Berührung auch die Hintergrundfarbe des UILabel geändert wird. Wie bekomme ich einen Verweis auf meine benutzerdefinierte Zelle?So erhalten Sie einen Verweis auf die Zelle von Benutzerfunktion

@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

Können Sie Ihre 'cellForRowAt indexPath' –

+1

' UIImage zeigen (mit dem Namen: „do“) 'wieder eine neue Instanz von' UIImage', jedes Mal erzeugt, die immer anders sein von Ihrem bereits gesetztes Bild. Daher wird Ihr Zustand immer in den Fall "sonst" fallen. –

Antwort

1

warum nicht ein Delegiertensystem verwenden? Auf diese Weise können Sie leicht eine Referenz auf Ihre Zelle erhalten.

In Sie cell.swift

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

Dann in Ihrer Zelle Klasse: Sie einen Delegaten Eigenschaft haben müssen, Ihre IBAction Methode, und eine Möglichkeit, Ihre Delegierten zu setzen:

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) 
    } 

} 

Schließlich in Ihrem Tableviewcontroller: Sie einrichten müssen die Delegierten als selbst bei der Konfiguration der Zelle, und implementieren die delegierte Methode:

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 
    } 

} 

So habe ich tipically Aktionen gesetzt für Zellen

+0

Danke, ich habe total die Macht der Delegierten vergessen :)) –

Verwandte Themen