2016-06-14 29 views
5

Mi chiedo come funzionano le funzioni nel titolo e anche il parametro del mittente.prepareForSegue e PerformSegueWithIdentifier mittente

Diciamo che un clic del pulsante chiama il metodo performSegue, anche quello chiama il metodo prepareSegue? Il metodo prepareSegue viene chiamato prima del metodo performSegue ma dopo aver premuto il pulsante?

Inoltre, il parametro "mittente" in entrambe le funzioni è collegato? Se passo una stringa come mittente nel metodo performSegue, questo verrà trasferito al parametro mittente nel metodo prepareSegue? In altre parole, se imposto il parametro sender nel metodo performSegue come "Hi world", il parametro sender nel metodo prepareSegue sarà anche la stessa stringa?

Grazie

risposta

16

ci sono, di fatto, due modi è possibile attivare un segue. Il primo è tramite un'azione su un elemento dell'interfaccia utente in Interface Builder, il secondo sta utilizzando performSegueWithIdentifier:sender: nel codice. Dico 'efficace', perché sotto le coperte, quando la scena viene caricato dallo storyboard, un gestore di azione è configurato che alla fine chiama performSegueWithIdentifier:sender:

Quando performSegueWithIdentifier:sender: viene chiamato, l'oggetto segue viene consegnato alla funzione prepareForSegue:sender: del controller della vista.

Nel caso in cui l'segue è stata iniziata da un'azione su un elemento dell'interfaccia utente, il mittente sarà tale elemento UI (cioè se è un collegamento azione su una UIButton allora il sender sarà l'istanza UIButton).

Se il seguito viene avviato dal codice che chiama il numero performSegueWithIdentifier:sender:, lo sender sarà qualsiasi oggetto passato come sender. Questo potrebbe essere il tuo controller di visualizzazione, un pulsante, un array, qualsiasi cosa. Quindi sì, se si passa "Ciao Mondo" per performSegueWithIdentifier:sender: come valore sender allora questo sarà il sender in prepareForSegue:sender:

In termini di ordine delle operazioni:

  1. performSegueWithIdentifier:sender è chiamato, sia per il codice o come risultato di un'azione su un elemento dell'interfaccia utente
  2. Se il controller di visualizzazione implementa shouldPerformSegueWithIdentifier:sender:, viene chiamata questa funzione. Se questa funzione restituisce false poi la segue viene annullata
  3. L'oggetto controller oggetto segue e vista di destinazione vengono creati
  4. Se il controller della vista implementa prepareForSegue:sender: allora questa funzione viene chiamata.
  5. Una volta restituito prepareForSegue:sender:, il completamento viene completato.
+0

Grazie per questo, mi ha salvato un po 'di backtracking - avevo bisogno di sapere se prepareForSegue sarebbe ancora essere chiamato in modo indipendente di controllare il valore di ritorno shouldPerformSegue. – MandisaW

15

Il metodo performSegue chiama un seguito da eseguire da una vista a un'altra. Prima che il seguito abbia effettivamente luogo, viene chiamato il metodo prepareForSegue e se vuoi passare i dati tra le viste, lo faresti lì.

Il metodo performSegue non accetta il parametro che si desidera inviare. È usato solo per chiamare il seguito in primo luogo. Tutti i dati che si desidera inviare verranno eseguiti tramite prepareForSegue.

Ecco un esempio.

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 

    performSegueWithIdentifier("test", sender: self) 
    //You can set the identifier in the storyboard, by clicking on the segue 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "test"{ 
     var vc = segue.destinationViewController as! RandomViewController 
     vc.data = "Data you want to pass" 
     //Data has to be a variable name in your RandomViewController 
    } 
} 

Fatemi sapere se questo aiuta!

+0

È possibile passare i dati che si desidera inviare come 'sender' in' performSegueWithIdentifier: sender: 'ma sarà necessario trasferirlo al controller della vista di destinazione in' prepareForSegue: mittente: ' – Paulw11

2

i miei due centesimi per i principianti ... a Swift 3 è:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

} 

Quindi, se si arriva di controllo (della classe MyController) implementa un metodo "fillData":

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if let destController = segue.destination as MyController{ 

     destController.fillData(...) 
    } 

} 
2

risposta di The_Curry_Man ha funzionato per me Ecco un aggiornamento del suo codice per Swift 3.

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view. 

    performSegue(withIdentifier: "test", sender: self) 
    //You can set the identifier in the storyboard, by clicking on the segue 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "test"{ 
     var vc = segue.destinationViewController as! RandomViewController 
     vc.data = "Data you want to pass" 
     //Data has to be a variable name in your RandomViewController 
    } 
}