2015-04-30 10 views
6

So come passare i dati usando segues dalla funzione prepareForSegue, ma la cosa ho un TableViewCell da cui ci sono due possibili follower a due diversi ViewControllers (solo dì A, B a partire da ora). È stato suggerito here che è meglio collegare i segui al controller View piuttosto che tableCell stesso, che ha funzionato perfettamente. Ma voglio passare le informazioni al secondo controller View quando si fa clic sulla cella, quindi come accedere a segue che ho collegato al ViewController Source.come accedere a segue in 'didSelectRowAtIndexPath' - Swift/IOS

Codice:

All'interno prepareForSegue

if segue.identifier == "showQuestionnaire"{ 
     if let indexPath = self.tableView.indexPathForSelectedRow() { 
     let controller = (segue.destinationViewController as! UINavigationController).topViewController as! QuestionnaireController 
     let patientQuestionnaire = patientQuestionnaires[indexPath.row] as! PatientQuestionnaire 
     controller.selectedQuestionnaire = patientQuestionnaire 
     self.performSegueWithIdentifier("showQuestionnaire", sender: self) 
     } 
    } 

Anche in questo caso: Questa domanda non è per quanto riguarda il passaggio di informazioni attraverso prepareForSegue

+0

Non capisco la domanda, ma se la domanda è come inviare i dati al prepareForSegue, utilizza il campo mittente del performSegueWithIdentifier – user3435374

+0

if ([follows.destinationViewController isKindOfClass: [A_VC class]]) {...} else {...} – OMGHaveFun

+1

Passare le informazioni in 'prepareForSegue' è il modo corretto per farlo. Non dovresti assolutamente chiamare "performSegueWithIdentifier" all'interno di "prepareForSegue". – dan

risposta

23

Si deve usare il metodo didSelectRowAtIndexPath per determinare se una cellula è stato selezionato.

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    self.performSegueWithIdentifier("showQuestionnaire", sender: indexPath); 
} 

Poi, nel tuo prepareForSegue metodo

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { 
    if (segue.identifier == "showQuestionnaire") { 
     let controller = (segue.destinationViewController as! UINavigationController).topViewController as! QuestionnaireController 
     let row = (sender as! NSIndexPath).row; //we know that sender is an NSIndexPath here. 
     let patientQuestionnaire = patientQuestionnaires[row] as! PatientQuestionnaire 
     controller.selectedQuestionnaire = patientQuestionnaire 
    } 
} 

Per spiegare ...

  1. ho usato il percorso indice come il mittente in modo da poter facilmente passare il percorso dell'indice. È anche possibile verificare la cella attualmente selezionata utilizzando altri metodi di UITableView, ma l'ho sempre eseguita con successo.
  2. Non è possibile inserire performSegueWithIdentifier all'interno del metodo Prepar per segue, perché performSegueWithIdentifier porta a prepareForSegue; Stai semplicemente girando e girando senza scopo. (Quando si desidera eseguire un seguito, prepareForSegue viene sempre eseguito)
  3. prepareForSegue non viene eseguito da solo quando viene selezionata una riga. Questo è dove hai bisogno di didSelectRowAtIndexPath. Avete bisogno di un performSegueWithIdentifier al di fuori del metodo, come descritto in precedenza, che dovrebbe essere in didSelectRowAtIndexPath
+0

Ho provato la soluzione, ma dà questo errore in linea 'let controller = (segue.destinationVIewController ....'. ** Impossibile cast valore di tipo 'UIViewController' (0x105866418) a 'CarePortal.QuestionnaireController' (0x1034f1850). ** – Sashi

+0

Probabilmente stai impostando il tipo di oggetto sbagliato nel cast, potresti controllare e assicurarti che tutto ciò che hai lanciato sia ciò che hai descritto? –

+1

Cambiare ** come! ** a ** come? ** ha fatto il trucco. Grazie @Nate. Swift sta davvero diventando severo sui valori opzionali: @ – Sashi

Problemi correlati