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ć?
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:
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:
Musisz wybrać akcję zdefiniowaną w kontrolerze widoku, do którego chcesz się rozwinąć:
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:
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:
Wybranie segue i przejście do Inspektora atrybutów ujawnia właściwość "Identifier". Użyj tego, aby nadać unikalny identyfikator Twojej segue:
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)
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.
Powinna być teraz opcja łączenia się z "- unwindToViewControllerNameHere "
To jest to, Twój segue odpręży się, gdy twój przycisk jest stuknięty.
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.
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):
A → H
B → H
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.
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:
Krok 3: Zbuduj i uruchom ...
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:
- Unwind Seague Completed - > TextLabel of viewControllerA is Changed.
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