Uważam to za ważne pytanie - sam to miałem. Możesz wykonać odwijanie segue programowo: 1. tworząc ręczny segue (przeciągnij ctrl z Właściciela pliku do wyjścia), 2. nadając mu nazwę w IB, a następnie 3. wykonując normalny -performSegueWithIdentifier: sender: w kodzie.
Yang Meyer
6
Nie powinno być zamknięte IMO. Użytkownicy, którzy głosowali za zamknięciem tego pytania, z pewnością nie mają tła Obj-C / Cocoa Touch.
LJ Wilson
Yang: Jak to się nazywa?
sarfata
Po prostu używam [self dismissViewControllerAnimated: TAK zakończenie: zero]; wyjść programowo. Nie wiem, czy to właściwa droga, czy nie.
tangqiaoboy
1
sarfata: Najpierw tworzysz „segregowanie ręczne” przeciągając klawiszem Ctrl z viewcontroller do „Exit”. Następnie możesz znaleźć segue w zarysie dokumentu.
huggie
Odpowiedzi:
283
Utwórz ręczny segue ( ctrl-drag od właściciela pliku do wyjścia),
Wybierz go w menu lewego kontrolera poniżej zielonego przycisku EXIT.
Wstaw nazwę segmentu, aby się zrelaksować.
Następnie - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.z identyfikatorem segue.
1) „Właściciel pliku” - czy to nie stara terminologia? Sprawdziłem przeciąganie z kontrolera widoku do ikony wyjścia. 2) Chociaż powinno to być oczywiste, Xcode szuka deklaracji w interfejsie IBAction, która przyjmuje argument UIStoryboardSegue; w sesji 407 sesji WWDC 2012 nie wspomniano o tym i nie wklejono tego kodu. Bez tego moja ikona wyjścia nie uaktywniałaby się podczas przeciągania do niej kontrolki. 3) To całkiem fajne, że na końcu dużej czerwonej strzałki w polu Akcja możesz nacisnąć strzałkę „idź tam”!
tobinjim,
71
Dla każdego, kto, podobnie jak ja, nadal ma problem z implementacją tej odpowiedzi, przygotowałem dokładniejszy przewodnik i przykład w tym repozytorium: github.com/bradley/iOSUnwindSegueProgramatically (Nie próbując się reklamować, po prostu uderzyłem głową w ścianę godzinami na ten temat pomaga mi zobaczenie działającej konfiguracji).
bradleygriffith
3
@bradleygriffith Jesteś niesamowicie super niesamowity. Dzięki za świetny przewodnik!
Eli_Rozen
7
@bradleygriffith Chciałbym, żebyś udzielił odpowiedzi, żebym mógł to zaznaczyć! Twój unikalny wkład polegał na ustaleniu, który kontroler widoku otrzymuje jaki kod . Nigdzie nie mogłem tego znaleźć. Dzięki!
Aaron Vegh,
3
Kluczem dla każdego, kto nadal się na tym boryka, jest to, że IBACTION musi znajdować się w kontrolerze widoku, do którego wracasz, a nie w tym, w którym obecnie się znajdujesz. @Bradleygriffith pisze to na GitHub, ale nie widziałem tego wymienione gdziekolwiek indziej. Ta część jest krytyczna.
Axeva,
163
Oto pełna odpowiedź na temat celu C i Swift:
1) Utwórz IBActionodwijany segment w docelowym kontrolerze widoku (do którego chcesz segregować). W dowolnym miejscu pliku implementacji.
2) Na kontrolerze widoku źródłowego (kontrolerze, z którego segregujesz), ⌃ + przeciągnij z „Nazwa działania”, aby wyjść. W wyskakującym okienku powinien zostać wyświetlony segment odwijania utworzony w kroku 1. (Jeśli go nie widzisz, przejrzyj krok pierwszy). Wybierz unwindToContainerVC: z wyskakującego okienka lub jakkolwiek nazwałeś swoją metodę połączenia kontrolera źródłowego z odprężającym IBAction.
3) Wybierz segue w konspekcie dokumentu kontrolera widoku źródłowego scenorysu (zostanie wymieniony u dołu) i podaj mu identyfikator .
4) Wywołaj odwijanie segue przy użyciu tej metody z kontrolera widoku źródłowego , zastępując nazwę odwijania segue.
NB Użyj właściwości sourceViewController parametru segue w metodzie unwind, aby uzyskać dostęp do wszystkich odsłoniętych właściwości kontrolera źródłowego. Zauważ też, że framework obsługuje zamykanie kontrolera źródłowego. Jeśli chcesz to potwierdzić, dodaj do kontrolera źródłowego metodę dealloc z komunikatem dziennika, który powinien zostać uruchomiony po zabiciu. Jeśli dealloc nie strzela, możesz mieć cykl zatrzymania.
Mój program nie działa, nawet nie jest wywoływany(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
xhg
2
to rozwiązanie nie działa, gdy kontroler widoku, do którego nie chcesz się przyzwyczaić, istnieje tylko w twojej serii ujęć, aka nie ma niestandardowego wdrożenia kodu
mnl
@ mnl nie jestem pewien, co mówisz, ale działa ze scenami scenariuszy lub stalówkami. Jeśli tworzysz scenę kontrolera widoku w kodzie, nie użyłbyś żadnych metod, które „zwrócą” IB w ich nazwie, co i tak jest naprawdę nieważne, ponieważ służą one do komunikacji między kodem a IB. Czy to odnosi się do twojego komentarza?
smileBot
1
Twoje zdjęcie pokazujące ctrl+dragod ViewControllerdo do Exitbyło niezwykle pomocne. Dzięki!
kbpontius
W przypadku wersji Swift 4.2: self.performSegue (withIdentifier: „unwindToVC”, nadawca: self)
Reefwing
81
bradleygriffithodpowiedź była świetna. Zrobiłem krok 10 i zrobiłem zrzut ekranu dla uproszczenia. To jest zrzut ekranu w Xcode 6.
Przeciągnij z wciśniętym klawiszem Control od pomarańczowej ikony do czerwonej ikony Wyjdź, aby utworzyć odprężenie bez żadnych działań / przycisków w widoku.
Larry, jest to całkowicie poprawne podejście, jeśli chcesz powrócić do poprzedniego kontrolera widoku, tj. Tego, który przedstawiał ten, z którego właśnie wychodzisz. Pojawiło się pytanie, ponieważ nowością w Xcode 4.5 jest możliwość „odpoczynku” jednego kontrolera widoku gdzieś w kolejności prezentacji do znacznie wcześniejszego kontrolera widoku. Szczegółowe informacje można znaleźć w sesji 407 WWDC 2012.
tobinjim,
11
Cytując tekst z uwagi technicznej Apple na temat odwijania segmentu: Aby dodać odwijany segment, który będzie uruchamiany tylko programowo, steruj + przeciągnij z ikony kontrolera widoku sceny do ikony wyjścia, a następnie wybierz akcję odwijania dla nowego segmentu z menu podręcznego.
z poziomu ViewController należy również wybrać segregację odwijania w ramach Sceny ViewController w serii ujęć, a w widoku właściwości na RHS upewnić się, że pole Indentifier zawiera nazwę, do której się odwołujesz w kodzie („mySegueName” w powyższym przykładzie ).
Jeśli pominiesz ten krok, powyższa linia zgłosi wyjątek, że nazwa seque nie jest znana.
2. W serii ujęć, z kontrolera, który chcesz oddzielić (odwijaj) od ctrl + przeciągnij ze znaku kontrolera, aby wyjść i wybierz metodę, którą utworzyłeś wcześniej:
3. Teraz możesz zauważyć, że w konspekcie dokumentu masz nową linię z tytułem „Unwind segue ....”. Teraz powinieneś kliknąć tę linię i otworzyć inspektora atrybutów, aby ustawić identyfikator (w moim przypadku unwindSegueIdentifier ).
4. Jesteś prawie gotowy! Teraz musisz otworzyć kontroler widoku, z którego chcesz się zrelaksować i stworzyć metodę, która wykona segue. Na przykład możesz dodać przycisk, połączyć go z kodem za pomocą @IBAction , a następnie w tym IBAction dodać perfromSegue (withIdentifier: sender :) metoda:
Czy można programowo utworzyć połączenie „wyjściowe” w kontrolerze widoku źródłowego?
Andrew Kirna
1
Swift 4.2, Xcode 10+
Dla tych, którzy zastanawiają się, jak to zrobić z VC nie skonfigurowanymi za pomocą scenorysu (ci, którzy przychodzą do tego pytania po wyszukiwaniu „programowo” + „odprężyć segue”).
Biorąc pod uwagę, że nie można programowo ustawić odwijania segue, najprostszym rozwiązaniem wyłącznie programowym jest wywołanie:
Zdecydowanie źle. Wywołaj performSegueWithIdentifier z dowolnego miejsca.
smileBot
Czy nie wykonałoby to po prostu odejścia segregującego, gdy tylko załaduje się widok? Zamiast występować, kiedy chcesz, na przykład po naciśnięciu przycisku.
Pahnev,
@Pahnev tak to zrobi. Nie wiem, skąd ta odpowiedź ma jakieś pozytywne głosy. Wywołanie performSegueWithIdentfierrobi dokładnie to: wykonanie segue z jednego ViewController do drugiego
ezcoding 28.09.16
Całkowicie źle. Po uruchomieniu przewinąłby się natychmiast.
Odpowiedzi:
Wstaw nazwę segmentu, aby się zrelaksować.
Następnie
- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.
z identyfikatorem segue.źródło
Oto pełna odpowiedź na temat celu C i Swift:
1) Utwórz
IBAction
odwijany segment w docelowym kontrolerze widoku (do którego chcesz segregować). W dowolnym miejscu pliku implementacji.2) Na kontrolerze widoku źródłowego (kontrolerze, z którego segregujesz), ⌃ + przeciągnij z „Nazwa działania”, aby wyjść. W wyskakującym okienku powinien zostać wyświetlony segment odwijania utworzony w kroku 1. (Jeśli go nie widzisz, przejrzyj krok pierwszy). Wybierz unwindToContainerVC: z wyskakującego okienka lub jakkolwiek nazwałeś swoją metodę połączenia kontrolera źródłowego z odprężającym IBAction.
3) Wybierz segue w konspekcie dokumentu kontrolera widoku źródłowego scenorysu (zostanie wymieniony u dołu) i podaj mu identyfikator .
4) Wywołaj odwijanie segue przy użyciu tej metody z kontrolera widoku źródłowego , zastępując nazwę odwijania segue.
// Cel C
[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];
// Szybki
self.performSegueWithIdentifier("unwindToContainerVC", sender: self)
NB Użyj właściwości sourceViewController parametru segue w metodzie unwind, aby uzyskać dostęp do wszystkich odsłoniętych właściwości kontrolera źródłowego. Zauważ też, że framework obsługuje zamykanie kontrolera źródłowego. Jeśli chcesz to potwierdzić, dodaj do kontrolera źródłowego metodę dealloc z komunikatem dziennika, który powinien zostać uruchomiony po zabiciu. Jeśli dealloc nie strzela, możesz mieć cykl zatrzymania.
źródło
(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
ctrl+drag
odViewController
do doExit
było niezwykle pomocne. Dzięki!bradleygriffith
odpowiedź była świetna. Zrobiłem krok 10 i zrobiłem zrzut ekranu dla uproszczenia. To jest zrzut ekranu w Xcode 6.unwind segue
na pasku bocznym:źródło
UIViewController
. Wtedy twoje rozwiązanie zadziałaUżyłem,
[self dismissViewControllerAnimated: YES completion: nil];
co spowoduje powrót do połączeniaViewController
.źródło
Cytując tekst z uwagi technicznej Apple na temat odwijania segmentu: Aby dodać odwijany segment, który będzie uruchamiany tylko programowo, steruj + przeciągnij z ikony kontrolera widoku sceny do ikony wyjścia, a następnie wybierz akcję odwijania dla nowego segmentu z menu podręcznego.
Link do uwagi technicznej
źródło
Powyższa odpowiedź Vishala Chaudhry'ego działała na mnie. Dodałbym również, aby ręcznie uruchomić seque przy użyciu:
z poziomu ViewController należy również wybrać segregację odwijania w ramach Sceny ViewController w serii ujęć, a w widoku właściwości na RHS upewnić się, że pole Indentifier zawiera nazwę, do której się odwołujesz w kodzie („mySegueName” w powyższym przykładzie ).
Jeśli pominiesz ten krok, powyższa linia zgłosi wyjątek, że nazwa seque nie jest znana.
źródło
Zgodne wstecz rozwiązanie, które będzie działać w wersjach wcześniejszych niż ios6, dla zainteresowanych:
źródło
SWIFT 4 :
1. Utwórz @IBAction z segue wewnątrz kontrolera, w którym chcesz się zrelaksować:
2. W serii ujęć, z kontrolera, który chcesz oddzielić (odwijaj) od ctrl + przeciągnij ze znaku kontrolera, aby wyjść i wybierz metodę, którą utworzyłeś wcześniej:
3. Teraz możesz zauważyć, że w konspekcie dokumentu masz nową linię z tytułem „Unwind segue ....”. Teraz powinieneś kliknąć tę linię i otworzyć inspektora atrybutów, aby ustawić identyfikator (w moim przypadku unwindSegueIdentifier ).
4. Jesteś prawie gotowy! Teraz musisz otworzyć kontroler widoku, z którego chcesz się zrelaksować i stworzyć metodę, która wykona segue. Na przykład możesz dodać przycisk, połączyć go z kodem za pomocą @IBAction , a następnie w tym IBAction dodać perfromSegue (withIdentifier: sender :) metoda:
To wszystko, co musisz zrobić!
źródło
Swift 4.2, Xcode 10+
Dla tych, którzy zastanawiają się, jak to zrobić z VC nie skonfigurowanymi za pomocą scenorysu (ci, którzy przychodzą do tego pytania po wyszukiwaniu „programowo” + „odprężyć segue”).
Biorąc pod uwagę, że nie można programowo ustawić odwijania segue, najprostszym rozwiązaniem wyłącznie programowym jest wywołanie:
navigationController?.popToRootViewController(animated: true)
który wyskoczy wszystkie kontrolery widoku na stosie z powrotem do głównego kontrolera widoku.
Aby wyświetlić tylko najwyższy kontroler widoku ze stosu nawigacji, użyj:
navigationController?.popViewController(animated: true)
źródło
FYI: Aby odpowiedź @ Vadima działała z ręcznym działaniem odwijania seque wywoływanym z kontrolera widoku, musisz umieścić polecenie:
wewnątrz metody nadpisanej klasy viewDidAppear w następujący sposób:
Jeśli umieścisz go w innych metodach ViewController jak viewDidLoad lub viewWillAppear zostanie zignorowane.
źródło
performSegueWithIdentfier
robi dokładnie to: wykonanie segue z jednego ViewController do drugiego