È possibile utilizzare delegation pattern. Supponendo di aver implementato una cella di tabella personalizzata, puoi definire una proprietà nella sua classe per contenere qualsiasi cosa tu ritenga utile per identificare la riga - può essere il suo indice, o (il mio modo preferito) un'istanza di una classe che rappresenta il dati visualizzati nella cella (lo chiamo MyCellData
.
L'idea è di lasciare che la cella notifichi al controller della vista tabella un tocco su quel pulsante, passando i dati rilevanti relativi (i dati visualizzati nella) riga. il controller di visualizzazione tabella quindi avvia un seguito e nel metodo prepareForSegue
sostituito memorizza i dati passati dalla cella al controller di destinazione.Questo modo se si devono visualizzare i dati dei dettagli sulla riga, si dispone di tutte le informazioni rilevanti, come ad esempio dettagli dei dati stessi o un identificatore che il controller della vista di destinazione può utilizzare per recuperare i dati ad esempio da un database locale o da un servizio remoto.
Definire un protocollo:
protocol MyCellDelegate {
func didTapMilk(data: MyCellData)
}
poi dichiarare una proprietà denominata delegate
nella classe di cellule, e chiamare il suo metodo didTapMilk
dalla IBAction
class MyTableCell : UITableViewCell {
var delegate: MyCellDelegate?
var data: MyCellData!
@IBAction func didTapMilk() {
if let delegate = self.delegate {
delegate.didTapMilk(self.data)
}
}
}
Avanti, implementare il protocollo in vista tabella controller, insieme a un override di prepareForSegue
extension MyTableViewController : MyCellDelegate {
func didTapMilk(data: MyCellData) {
performSegueWithIdentifier("mySegueId", sender: data)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if segue.identifier == "mySegueId" {
let vc: MyDestinationViewController = segue.destinationViewController as MyDestinationViewController
vc.data = sender as? MyCellData
}
}
}
Ovviamente è necessaria una proprietà data
sul controller di visualizzazione di destinazione affinché funzioni. Come accennato in precedenza, se quello che fa è visualizzare i dettagli sulla riga, è possibile incorporare tutti i dati richiesti nella classe MyCellData
o almeno ciò che è necessario per recuperare i dati da qualsiasi origine (ad esempio un DB locale, un servizio remoto, eccetera.).
Ultimo, in cellForRowAtIndexPath, memorizzare i dati nella cella e impostare la sua delegate
proprietà self
:
extension MyTableViewController : UITableViewDataSource {
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let data: MyCellData = retrieveDataForCell(indexPath.row) // Retrieve the data to pass to the cell
let cell = self.tableView.dequeueReusableCellWithIdentifier("myCellIdentifier") as MyTableCell
cell.data = data
cell.delegate = self
// ... other initializations
return cell
}
}
Va bene ho il controllo cliccata e ora quando clicco il tasto l'applicazione si blocca sulla prima linea della AppDelegate con "SIGABRT" – skyguy
Non importa ho preso – skyguy
penso che dovrebbe essere ** self.performSegueWithIdentifier ("circa", il mittente : mittente) ** – Mehmet