Korzystanie z scenorysu jest bardzo proste. Po prostu przeciągnij akcję do „Wyjdź”. Ale jak mam to nazwać z mojego kodu?
Korzystanie z scenorysu jest bardzo proste. Po prostu przeciągnij akcję do „Wyjdź”. Ale jak mam to nazwać z mojego kodu?
Odpowiedzi:
Wstaw nazwę segmentu, aby się zrelaksować.
Następnie - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.
z identyfikatorem segue.
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.
// Objective C
- (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {
}
// Swift
@IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {
}
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.
(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
ctrl+drag
od ViewController
do do Exit
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:[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
UIViewController
. Wtedy twoje rozwiązanie zadziała
Użyłem, [self dismissViewControllerAnimated: YES completion: nil];
co spowoduje powrót do połączenia ViewController
.
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.
Powyższa odpowiedź Vishala Chaudhry'ego działała na mnie. Dodałbym również, aby ręcznie uruchomić seque przy użyciu:
[self performSegueWithIdentifier:@"mySegueName" sender:self];
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.
Zgodne wstecz rozwiązanie, które będzie działać w wersjach wcześniejszych niż ios6, dla zainteresowanych:
- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated {
for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) {
UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i];
if ([vc isKindOfClass:vcClass]) {
[self.navigationController popToViewController:vc animated:animated];
return;
}
}
}
SWIFT 4 :
1. Utwórz @IBAction z segue wewnątrz kontrolera, w którym chcesz się zrelaksować:
@IBAction func unwindToVC(segue: UIStoryboardSegue) {
}
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:
@IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
}
To wszystko, co musisz zrobić!
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)
FYI: Aby odpowiedź @ Vadima działała z ręcznym działaniem odwijania seque wywoływanym z kontrolera widoku, musisz umieścić polecenie:
[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];
wewnątrz metody nadpisanej klasy viewDidAppear w następujący sposób:
-(void) viewDidAppear:(BOOL) animated
{
[super viewDidAppear: animated];
[self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}
Jeśli umieścisz go w innych metodach ViewController jak viewDidLoad lub viewWillAppear zostanie zignorowane.
performSegueWithIdentfier
robi dokładnie to: wykonanie segue z jednego ViewController do drugiego