2017-01-15 22 views
0

Ich habe eine benutzerdefinierte UITableViewCell mit 2 Etiketten und einem Knopf. Die Zelle seine eigene Klasse hat:Informationen aus der Tabellenzelle abrufen?

class personTableCell: UITableViewCell { 
    @IBOutlet weak var nameLabel: UILabel! 
    @IBOutlet weak var emailLabel: UILabel! 

    @IBAction func inviteButtonPressed(_ sender: Any) { 
     self.accessoryType = .checkmark 
    } 
} 

Innerhalb der Ansicht-Controller, der Tabellen-Ansicht enthält, füge ich die Zellen der Tabelle in dieser Methode:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "person", for: indexPath) as? personTableCell 
     cell?.nameLabel.text = results[indexPath.row].name 
     cell?.emailLabel.text = results[indexPath.row].email 
     return cell! 
} 

Wenn ein Benutzer auf die Schaltfläche innerhalb der drückt Zelle, die das @IBAction func inviteButtonPressed aufruft, möchte ich den Text der Zelle Beschriftungen in einem Array hinzufügen, das in demselben Ansichtscontroller wie der Tabelle initialisiert wird.

Wie kann ich so etwas erreichen, wenn die @IBAction func inviteButtonPressed in einer separaten Datei als View Controller der Tabelle ist?

+0

nicht bezogen werden: Zu viele Fragen und Ausrufezeichen für die Vögel. Ernsthaft: Niemals Informationen aus der Tabellenansichtszelle (der Ansicht) holen, sie aus dem Datenquellenfeld (dem Modell) holen – vadian

+0

@vadian bitte ausführlich? – MarksCode

+0

'dequeueReusableCell (withIdentifier: indexPath)' gibt eine nicht optionale Zelle zurück. Es ist ziemlich dumm, es optional zu spielen. Die Zelle wird offensichtlich in Interface Builder erstellt, so dass Sie wissen, dass sie existiert. – vadian

Antwort

1

Ich denke, mit Delegate ist eine der Lösungen.

In TableViewCell Klasse

@objc protocol PersonTableViewCellDelegate { 
    func personTableViewCellInviteButtonPressed(cell: PersonTableViewCell) 
} 

class PersonTableViewCell: UITableViewCell { 

    weak var delegate: PersonTableViewCellDelegate? 

    @IBAction func inviteButtonPressed(_ sender: Any) { 
     delegate?.personTableViewCellInviteButtonPressed(cell: self) 
    } 

} 

In Viewcontroller Klasse

class TableViewController: UITableViewController, PersonTableViewCellDelegate { 

    var results: [Person] = [] 
    var invited: [Person] = [] 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "person", for: indexPath) as! PersonTableViewCell 
     cell.nameLabel.text = results[indexPath.row].name 
     cell.emailLabel.text = results[indexPath.row].email 
     cell.delegate = self 
     return cell 
    } 

    func personTableViewCellInviteButtonPressed(cell: PersonTableViewCell) { 
     guard let indexPath = tableView.indexPath(for: cell) else { 
      return 
     } 
     let person = results[indexPath.row] 
     invited.append(person) 
    } 

} 
Verwandte Themen