Do czego służą i jak z nich korzystać?

IOS 6 i Xcode 4.5 ma nową funkcję określaną jako "Unwind Segue":

Dzięki temu możliwe jest przejście do istniejących instancji scen w storyboardzie.]}

Oprócz tego krótkiego wpisu w Uwagach do wydania Xcode 4.5, UIViewController ma teraz kilka nowych metod:

- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier

Jak działają odprężacze i do czego można je wykorzystać?

Author: max_, 2012-09-24

6 answers

W skrócie

An unwind segue (czasami nazywany exit segue ) może być używany do poruszania się z powrotem przez segmenty push, modal lub popover (tak, jak gdybyś zdjął element nawigacyjny z paska nawigacyjnego, zamknął wyskakujące okno lub odrzucił modalnie przedstawiony kontroler widoku). Ponadto możesz się odprężyć nie tylko przez jeden, ale przez szereg segmentów push / modal/popover, np. akcja.

Podczas wykonywania segue unwind, musisz określić akcję, która jest metodą akcji kontrolera widoku, do którego chcesz się odwijać.

Objective-C:

- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}

Swift:

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}

Nazwa tej metody akcji jest używana podczas tworzenia segue unwind w storyboardzie. Ponadto metoda ta jest wywoływana tuż przed wykonaniem segue unwind. Kontroler widoku źródłowego można pobrać z przekazanego parametru UIStoryboardSegue do interakcja z kontrolerem widoku, który zainicjował segue (np. w celu uzyskania wartości właściwości kontrolera widoku modalnego). Pod tym względem metoda ma podobną funkcję jak metoda prepareForSegue: z UIViewController.

Aktualizacja IOS 8: rozwiń segmenty działa również z adaptacyjnymi segmentami iOS 8, takimi jak Pokaż i Pokaż szczegóły.

Przykład

Zróbmy storyboard z kontrolerem nawigacyjnym i trójką dzieci Kontrolery:

Tutaj wpisz opis obrazka

Z kontrolera zielonego widoku można przejść do kontrolera czerwonego widoku. Z niebieskiego można się zrelaksować na zielony lub na czerwony przez zielony. Aby włączyć odwijanie należy dodać specjalne metody akcji do Czerwonego i zielonego, np. tutaj jest metoda akcji w kolorze czerwonym:

Objective-C:

@implementation RedViewController

- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}

@end

Swift:

@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}

Po dodaniu metody akcji można zdefiniować segue unwind w storyboardzie przez sterowanie-przeciąganie do ikony wyjścia. W tym miejscu po naciśnięciu przycisku chcemy odmienić się na czerwony z Zielonego:

Tutaj wpisz opis obrazka

Musisz wybrać akcję zdefiniowaną w kontrolerze widoku, do którego chcesz się rozwinąć:

Tutaj wpisz opis obrazka

Możesz także zmienić kolor na czerwony z Niebieskiego (który jest "dwa kroki dalej" w stosie nawigacyjnym). Kluczem jest wybranie prawidłowej akcji odwijania.

Przed wykonaniem segmentu unwind wywoływana jest metoda akcji. W przykładzie I zdefiniowano segue unwind do czerwonego zarówno z Zielonego, jak i niebieskiego. Możemy uzyskać dostęp do źródła unwind w metodzie action poprzez parametr UIStoryboardSegue:

Objective-C:

- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
    UIViewController* sourceViewController = unwindSegue.sourceViewController;

    if ([sourceViewController isKindOfClass:[BlueViewController class]])
    {
        NSLog(@"Coming from BLUE!");
    }
    else if ([sourceViewController isKindOfClass:[GreenViewController class]])
    {
        NSLog(@"Coming from GREEN!");
    }
}

Swift:

@IBAction func unwindToRed(unwindSegue: UIStoryboardSegue) {
    if let blueViewController = unwindSegue.sourceViewController as? BlueViewController {
        println("Coming from BLUE")
    }
    else if let redViewController = unwindSegue.sourceViewController as? RedViewController {
        println("Coming from RED")
    }
}
Odwijanie działa również poprzez kombinację segmentów push / modal. Jeśli dodam inny Żółty kontroler widoku z modalnym segue, możemy rozwinąć się z żółtego aż do Czerwonego w jednym kroku:

Tutaj wpisz opis obrazka

Odwijanie z kodu

Gdy zdefiniujesz segue unwind poprzez przeciągnięcie czegoś do symbolu wyjścia kontrolera widoku, w obrysie dokumentu pojawia się nowy segue:

Tutaj wpisz opis obrazka

Wybranie segue i przejście do Inspektora atrybutów ujawnia właściwość "Identifier". Użyj tego, aby nadać unikalny identyfikator Twojej segue:

Tutaj wpisz opis obrazka

Po tym, segue unwind może być wykonywany z kodu, tak jak każdy inny segue:

Objective-C:

[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self];

Swift:

performSegueWithIdentifier("UnwindToRedSegueID", sender: self)
 1231
Author: Imre Kelényi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-21 14:09:04

Jeśli chodzi o to, jak korzystać z segmentów odwijania w Storyboardzie...

Krok 1)

Przejdź do kodu kontrolera widoku, który chcesz zmienić na i dodaj to:

Objective-C

- (IBAction)unwindToViewControllerNameHere:(UIStoryboardSegue *)segue {
    //nothing goes here
}

należy również zadeklarować tę metodę w swoim .plik h W Obj-C

Swift

@IBAction func unwindToViewControllerNameHere(segue: UIStoryboardSegue) {
    //nothing goes here
}

Krok 2)

W storyboard przejdź do widoku, z którego chcesz się zrelaksować i po prostu przeciągnij segue z przycisku lub cokolwiek do małej pomarańczowej ikony "wyjście"w prawym górnym rogu widoku źródła.

Tutaj wpisz opis obrazka

Powinna być teraz opcja łączenia się z "- unwindToViewControllerNameHere "

To jest to, Twój segue odpręży się, gdy twój przycisk jest stuknięty.

 157
Author: Travis M.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-24 05:39:26

Odwijane segmenty służą do "powrotu" do jakiegoś kontrolera widoku, z którego, poprzez szereg segmentów, dostajesz się do kontrolera widoku" bieżącego".

Wyobraź sobie, że masz coś MyNavController z A jako kontrolerem widoku głównego. Teraz używasz przycisku push do B. Teraz Kontroler nawigacyjny ma A i B w tablicy viewControllers, A B jest widoczny. Teraz prezentujesz C modalnie.

Z unwind segues, można teraz unwind "wstecz" z C do B (tj. odrzucenie modalnie przedstawionego kontroler widoku), w zasadzie "cofanie" segmentu modalnego. Można nawet odprężyć się aż do kontrolera widoku głównego A, cofając zarówno segue modalny, jak i segue push.

Odwijanie ułatwia powrót. Na przykład, przed iOS 6 najlepszą praktyką odrzucania prezentowanych kontrolerów widoku było ustawienie prezentowanego kontrolera widoku jako delegata prezentowanego kontrolera widoku, a następnie wywołanie niestandardowej metody delegata, która następnie odrzuca kontroler widoku. presentedViewController . Brzmi kłopotliwie i skomplikowanie? Było. Dlatego odpoczynek jest miły.

 43
Author: Yang Meyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-17 00:51:37

Coś, czego nie widziałem wymienione w innych odpowiedzi tutaj jest jak radzić sobie z rozwijaniem, gdy nie wiesz, skąd początkowy segue pochodzi, co dla mnie jest jeszcze ważniejsze przypadek użycia. Na przykład, załóżmy, że masz kontroler widoku pomocy (H ), który wyświetlasz modalnie z dwóch różnych kontrolerów widoku (A i B):

AH
BH

Jak ustawić relaks tak, aby wrócić do prawidłowy kontroler widoku? Odpowiedź jest taka, że deklarujesz akcję unwind w A i B o tej samej nazwie , np.:

// put in AViewController.swift and BViewController.swift
@IBAction func unwindFromHelp(sender: UIStoryboardSegue) {
    // empty
}

W ten sposób unwind znajdzie kontroler widoku (A lub B) zainicjował segue i powróci do niego.

Innymi słowy, myśl o akcji unwind jako opisującej, gdzie dochodzi segue z, a nie dokąd zmierza.

 29
Author: shawkinaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-15 19:33:59

Swift iOS:

Krok 1: zdefiniuj tę metodę w widoku kontrolera głównego. w którym chcesz wrócić:

//pragma mark - Unwind Seques
@IBAction func goToSideMenu(segue: UIStoryboardSegue) {

    println("Called goToSideMenu: unwind action")

}

Krok 2: (StoryBoard) kliknij prawym przyciskiem myszy na przycisku wyjścia SLAVE/CHILD i wybierz "goToSideMenu" jako działanie, aby połączyć się z Tobą przycisk, na którym klikniesz, aby powrócić do ciebie widok kontrolera głównego:

Tutaj wpisz opis obrazkaKrok 3: Zbuduj i uruchom ...

 22
Author: Vinod Joshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-21 13:39:44

Na przykład jeśli przejdziesz z viewControllerB do viewcontrollera wtedy w viewcontrollera poniżej delegat wywoła i dane będą udostępniane.

@IBAction func unWindSeague (_ sender : UIStoryboardSegue) {
        if sender.source is ViewControllerB  {
            if let _ = sender.source as? ViewControllerB {
                self.textLabel.text = "Came from B = B->A , B exited"
            }
            
        }

}
  • Unwind Seague Source View Controller (musisz podłączyć przycisk Exit do ikony wyjścia VC i podłączyć go do unwindseague:

Tutaj wpisz opis obrazka

  • Unwind Seague Completed - > TextLabel of viewControllerA is Changed.

Tutaj wpisz opis obrazka

 1
Author: Tech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-22 14:08:20