2016-06-14 12 views
5

Zastanawiam się, jak działają funkcje w tytule, a także o parametrze nadawcy.prepareForSegue i PerformSegueWithIdentifier nadawca

Powiedzmy, że kliknięcie przycisku wywołuje metodę performSegue, czy to również wywołuje metodę prepareSegue? Czy metoda prepareSegue jest wywoływana przed metodą performSegue, ale po naciśnięciu przycisku?

Ponadto, czy parametr "nadawca" występuje w obu połączonych funkcjach? Jeśli przekazuję ciąg znaków jako nadawca w metodzie performSegue, czy przeniesie to do parametru nadawcy w metodzie prepareSegue? Innymi słowy, jeśli ustawię parametr sender w metodzie performSegue jako "Hi world", czy parametr sender w metodzie prepareSegue będzie również tym samym ciągiem znaków?

Dzięki

Odpowiedz

16

Są skuteczne, dwa sposoby, można wywołać segue. Pierwsza polega na działaniu na elemencie interfejsu użytkownika w Konstruktorze interfejsów, a druga na użyciu kodu performSegueWithIdentifier:sender:. Mówię „skutecznie”, bo pod kołdrą, gdy scena jest ładowany z serii ujęć, procedura obsługi działanie jest skonfigurowany, że ostatecznie nazywa performSegueWithIdentifier:sender:

Kiedy performSegueWithIdentifier:sender: nazywa, obiekt segue jest dostarczana do prepareForSegue:sender: funkcji Państwa zdanie kontrolera.

W przypadku, gdy Segue zainicjowano przez działanie na element interfejsu użytkownika, to nadawca będzie, że elementem interfejsu użytkownika (to jest, jeśli połączenie działania na UIButton następnie sender będzie wystąpienie UIButton).

Jeśli przełączenie zostanie zainicjowane przez kod wywołujący performSegueWithIdentifier:sender:, wówczas sender będzie dowolnym obiektem przekazanym jako sender. Może to być kontroler widoku, przycisk, tablica, cokolwiek. Więc tak, jeśli przejdą „Hello World” do performSegueWithIdentifier:sender: jako wartość sender wówczas będą sender w prepareForSegue:sender:

pod względem kolejności operacji:

  1. performSegueWithIdentifier:sender nazywa, albo przez kod lub w wyniku działania elementu interfejsu użytkownika
  2. Jeśli kontroler podglądu implementuje shouldPerformSegueWithIdentifier:sender:, wówczas wywoływana jest ta funkcja. Jeśli ta funkcja zwraca false wtedy segue jest anulowana
  3. Przedmiotem segue i widok docelowy kontroler obiektu są tworzone
  4. Jeśli kontroler widoku implementuje prepareForSegue:sender: wtedy ta funkcja jest wywoływana.
  5. Po powrocie prepareForSegue:sender:, przejście kończy się.
+0

Dzięki za to, że uratował mi trochę Backtracking - Musiałam wiedzieć, czy prepareForSegue nadal będzie nazywany niezależnie od sprawdzenia wartości zwracanej shouldPerformSegue. – MandisaW

15

Metoda performSegue wywołuje segue do wykonania z jednego widoku do drugiego. Zanim rzeczywiście nastąpi segue, wywoływana jest metoda prepareForSegue, a jeśli chcesz przekazać dane między widokami, zrobiłbyś to tam.

Metoda performSegue nie przyjmuje parametru, który ma zostać wysłany. Jest używany tylko do wywoływania segue. Wszelkie dane, które chcesz wysłać, zostaną wykonane za pomocą metody prepareForSegue.

Oto przykład.

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

Daj mi znać, jeśli to pomoże!

+0

Możesz przekazać dane, które chcesz wysłać jako 'nadawca' w' performSegueWithIdentifier: sender: ', ale będziesz musiał przenieść je do kontrolera widoku docelowego w' prepareForSegue: sender: ' – Paulw11

2

moich dwóch centów dla początkujących ... w Swift 3 jest:

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

} 

Tak więc, jeśli przybyciu kontroler (klasy MyController) wdraża "fillData" metoda:

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

    if let destController = segue.destination as MyController{ 

     destController.fillData(...) 
    } 

} 
2

odpowiedź The_Curry_Man za pracował dla mnie. Oto aktualizację swojego kodu do 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 
    } 
} 
Powiązane problemy