2014-09-28 17 views
18

OK, quindi ho una scena TableView e ho intenzione di mettere un pulsante in ciascuna cella e ho bisogno di ogni cella per, quando premuto, segue alla sua scena ViewController . In altre parole, ho bisogno di sapere come collegare un pulsante a una scena (L'unico pulsante che ho adesso è "latte")Swift: Attiva il pulsante per passare alla nuova scena

So come creare un IBAction collegato a un pulsante, ma cosa metterei nel IBAction?

Sono un principiante quindi ho bisogno di una spiegazione passo passo qui. Ho incluso una foto del mio storyboard. Non ho ancora scritto alcun codice. enter image description here

risposta

28

Se si desidera che un pulsante attivi la transizione di seguito, la cosa più semplice da fare è Control + Fare clic dal pulsante sul controller di visualizzazione e scegliere un'opzione Segue (come push). Questo lo collegherà in IB per te.

Se si desidera scrivere manualmente il codice per farlo manualmente, è possibile farlo nominando il seguito (è disponibile un'opzione di identificatore che è possibile impostare dopo averlo creato - è comunque necessario creare il seguito in IB prima di poter farlo) e poi si può scatenare con questo codice:

V2

@IBAction func about(sender: AnyObject) { 
    performSegueWithIdentifier("about", sender: sender) 
} 

V3

@IBAction func about(_ sender: Any) { 
    performSegue(withIdentifier: "about", sender: sender) 
} 
+0

Va bene ho il controllo cliccata e ora quando clicco il tasto l'applicazione si blocca sulla prima linea della AppDelegate con "SIGABRT" – skyguy

+0

Non importa ho preso – skyguy

+0

penso che dovrebbe essere ** self.performSegueWithIdentifier ("circa", il mittente : mittente) ** – Mehmet

13

È 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 
    } 
} 
0

Usa self.performSegueWithIdentifier("yourViewSegue", sender: sender) sotto il vostro evento per la gestione click del pulsante:

@IBAction func redButtonClicked(sender: AnyObject) { 
    self.performSegueWithIdentifier("redView", sender: sender) 
} 

In precedenza codice, redView è l'identificatore dei passaggi.

Problemi correlati