W skrócie
Odpoczynek segue (czasami nazywane wyjściem segue ) może być używany do nawigacji z powrotem przez Push, modalnych lub popover segues (jakbyś wpadł element nawigacyjny z paska nawigacyjnego, zamknął popover lub oddalił modally przedstawione kontroler widoku). Co więcej, możesz odprężyć się nie tylko za pomocą jednego, ale również szeregu poleceń push / modal / popover, np. „Cofnij się” o kilka kroków w hierarchii nawigacji za pomocą pojedynczej operacji cofania.
Kiedy wykonujesz segment odwijania, musisz określić akcję, która jest metodą akcji kontrolera widoku, do której chcesz się odprężyć.
Cel C:
- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}
Szybki:
@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}
Nazwa tej metody akcji jest używana podczas tworzenia odwijanego segmentu w serii ujęć. Ponadto metoda ta jest wywoływana tuż przed wykonaniem segue odwijania. Możesz pobrać źródłowy kontroler widoku z przekazanego UIStoryboardSegue
parametru do interakcji z kontrolerem widoku, który zainicjował segue (np. Aby uzyskać wartości właściwości modalnego kontrolera widoku). Pod tym względem metoda ma podobną funkcję jak prepareForSegue:
metoda UIViewController
.
Aktualizacja iOS 8: Sekwencje odwijania działają również z sekwencjami adaptacyjnymi iOS 8, takimi jak Pokaż i Pokaż szczegóły .
Przykład
Daj nam scenorys z kontrolerem nawigacyjnym i trzema kontrolerami widoku potomnego:
Z kontrolera Green View możesz odpocząć (nawigacja wstecz) do kontrolera Red View. Z niebieskiego możesz odpocząć do zielonego lub do czerwonego przez zielony. Aby włączyć odwijanie, musisz dodać specjalne metody akcji do czerwonego i zielonego, np. Oto metoda akcji w czerwonym:
Cel C:
@implementation RedViewController
- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}
@end
Szybki:
@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}
Po dodaniu metody akcji możesz zdefiniować odwijanie w serii ujęć, przeciągając klawiszem Control na ikonę Wyjdź. Tutaj chcemy zrelaksować się do czerwonego z zielonego po naciśnięciu przycisku:
Musisz wybrać akcję zdefiniowaną w kontrolerze widoku, w którym chcesz się zrelaksować:
Możesz także odprężyć się na kolor czerwony z niebieskiego (który znajduje się „dwa kroki dalej” na stosie nawigacji). Kluczem jest wybranie właściwej akcji odwijania.
Przed wykonaniem segmentu odwijania wywoływana jest metoda akcji. W tym przykładzie zdefiniowałem odejście do czerwonego od zielonego i niebieskiego. Możemy uzyskać dostęp do źródła odwijania w metodzie akcji za pomocą parametru UIStoryboardSegue:
Cel 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!");
}
}
Szybki:
@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ę sekwencji push / modal. Np. Jeśli dodam inny kontroler widoku żółtego z modalnym segmentem, moglibyśmy odprężyć się od żółtego aż do czerwonego w jednym kroku:
Odwijanie z kodu
Po zdefiniowaniu segregacji odwijania poprzez przeciągnięcie czegoś do symbolu wyjścia kontrolera widoku, nowy kontur pojawia się w konspekcie dokumentu:
Wybranie segmentu i przejście do Inspektora atrybutów ujawnia właściwość „Identyfikator”. Użyj tego, aby nadać unikatowemu identyfikatorowi swój identyfikator:
Następnie można wykonać odwijanie segue z kodu, tak jak każdy inny segment:
Cel C:
[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self];
Szybki:
performSegueWithIdentifier("UnwindToRedSegueID", sender: self)
dismissViewControllerAnimated:completion:
lub nie mogąpopViewControllerAnimated:
osiągnąć tego samego?dismissViewControllerAnimated:completion:
lubpopViewControllerAnimated:
jest to, że wywoływana jest metoda dodana do kontrolera widoku, do którego się odwijasz, dzięki czemu masz łatwy sposób wiedzieć, że prezentowany kontroler widoku jest zakończony bez konieczności zmieniania prezentującego kontrolera widoku w delegata prezentowanego kontrolera widoku .Jeśli chodzi o korzystanie z sekwencji rozwijania w StoryBoard ...
Krok 1)
Przejdź do kodu kontrolera widoku, do którego chcesz się odprężyć, i dodaj to:
Cel C
Należy również zadeklarować tę metodę w pliku .h w Obj-C
Szybki
Krok 2)
W scenorysie 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łowego.
Powinna być teraz opcja połączenia z „--indindToViewControllerNameHere”
To wszystko, Twój segue odpręży się po naciśnięciu przycisku.
źródło
Sekwencje odwijania są używane do „powrotu” do jakiegoś kontrolera widoku, z którego poprzez szereg sekwencji można przejść do „bieżącego” kontrolera widoku.
Wyobraź sobie, że masz coś
MyNavController
zA
kontrolerem widoku głównego. Teraz używasz push push doB
. Teraz kontroler nawigacyjny ma w swojejviewControllers
tablicy A i B , a B jest widoczne. Teraz się prezentujeszC
modalnie.Dzięki sekwencjom odprężania można teraz odprężyć „wstecz” od
C
doB
(tj. Odrzucając przedstawiony modalnie kontroler widoku), po prostu „cofając” segregację modalną. Możesz nawet zrelaksować się z powrotem do kontrolera widoku głównegoA
, cofając zarówno segment modalny, jak i segment push.Sekwens odwijania ułatwia cofanie się. Na przykład przed iOS 6 najlepszą praktyką do odrzucania prezentowanych kontrolerów widoku było ustawienie kontrolera widoku prezentującego jako delegata prezentowanego kontrolera widoku, a następnie wywołanie niestandardowej metody delegowania, która następnie zwalnia przedstawionego kontrolera widoku . Brzmi niewygodny i skomplikowany? To było. Właśnie dlatego odprężające segue są fajne.
źródło
dismissViewController:animated
z przedstawionego kontrolera. Nie musisz tego delegować. Oczywiście, jeśli chcesz przekazać dane z powrotem, potrzebujesz delegacji lub innej metody.dismissViewController:animated:
z prezentowanego kontrolera, „najlepszą praktyką” było rzeczywiście wywołanie metody delegowania na kontrolerze prezentującym, aby zrobić to za ciebie, jak wspomniał Yang.Coś, o czym nie wspomniałem w innych odpowiedziach tutaj, to sposób radzenia sobie z rozwijaniem się, gdy nie wiesz, skąd pochodzi początkowy segment, co jest dla mnie jeszcze ważniejszym przypadkiem użycia. Załóżmy na przykład, ż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 skonfigurować segment odwijania, aby wrócić do właściwego kontrolera widoku? Odpowiedź jest taka, że deklarujesz akcję odwijania w A i B o tej samej nazwie , np .:
W ten sposób odprężenie znajdzie dowolny kontroler widoku ( A lub B ), który zainicjował segue i wróci do niego.
Innymi słowy, myślę o odwijania działania jako opisujące gdzie segue przychodzi od , raczej niż gdzie to będzie.
źródło
Swift iOS:
Krok 1: zdefiniuj tę metodę w widoku kontrolera MASTER. w którym chcesz wrócić:
Krok 2: (StoryBoard) Kliknij prawym przyciskiem myszy przycisk SLAVE / CHILD EXIT i wybierz „goToSideMenu” jako czynność, aby połączyć Cię Przycisk, na którym klikniesz, aby powrócić do widoku kontrolera MASTER:
krok 3: Zbuduj i uruchom ...
źródło
Na przykład, jeśli nawigujesz z viewControllerB do viewControllerA, to w twoim viewControllerA poniżej delegat zadzwoni i dane będą udostępniane.
źródło