Tworzenie segmentu programowo

Mam wspólne UIViewController, które wszystkie moje UIViewsControllers rozciągają się na ponowne użycie niektórych typowych operacji.

Chcę ustawić segue na tej "wspólnej" UIViewController tak, aby wszystkie pozostałe UIViewControllers dziedziczyły.

Próbuję wymyślić, jak to zrobić programowo.

Myślę, że pytanie może być również jak ustawić segue dla wszystkich moich UIViewControllers bez wchodzenia do tablicy historii i zrobić je ręcznie.

Author: Alex Cio, 2012-03-13

13 answers

Z definicji segue nie może istnieć niezależnie od storyboardu. Jest nawet tam w nazwie klasy: UIStoryboardSegue. Nie tworzysz segmentów programowo - to środowisko uruchomieniowe storyboard tworzy je dla Ciebie. Zwykle można wywołać performSegueWithIdentifier: w kodzie kontrolera widoku, ale polega to na tym, że segue jest już skonfigurowany w storyboardzie do odwoływania się.

Myślę, że zadajesz sobie pytanie, jak możesz stworzyć metodę w kontrolerze widoku (klasie bazowej), która przejdzie do nowego kontrolera widoku i będzie dziedziczone przez wszystkie klasy pochodne. Możesz to zrobić, tworząc metodę podobną do tej do kontrolera widoku klasy bazowej:

- (IBAction)pushMyNewViewController
{
    MyNewViewController *myNewVC = [[MyNewViewController alloc] init];

    // do any setup you need for myNewVC

    [self presentModalViewController:myNewVC animated:YES];
}

A następnie w klasie pochodnej wywołaj tę metodę po kliknięciu odpowiedniego przycisku lub wybraniu wiersza tabeli lub cokolwiek innego.

 160
Author: jonkroll,
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
2012-03-12 21:38:55

Pomyślałam, że dodam jeszcze jedną możliwość. Jedną z rzeczy, które możesz zrobić, jest to, że możesz połączyć dwie sceny w storyboardzie za pomocą segue, który nie jest dołączony do akcji, a następnie programowo wyzwalać segue wewnątrz kontrolera widoku. Sposób, w jaki to robisz, polega na tym, że musisz przeciągnąć ikonę właściciela pliku u dołu sceny storyboard, która jest sceną segueing, i przeciągnąć prawym przyciskiem myszy do sceny docelowej. Dorzucę obrazek, który pomoże wyjaśnić.

Tutaj wpisz opis obrazka

A wyskakujące okienko pokaże "ręczny Segue". Wybrałem Push jako typ. Dotknij małego kwadratu i upewnij się, że jesteś w Inspektorze atrybutów. Nadaj mu identyfikator, którego użyjesz do odwoływania się do niego w kodzie.

Tutaj wpisz opis obrazka

OK, następnie będę segutować za pomocą przycisku paska programowego. W viewDidLoad lub gdzie indziej stworzę pozycję przycisku na pasku nawigacyjnym o tym kodzie:

UIBarButtonItem *buttonizeButton = [[UIBarButtonItem alloc] initWithTitle:@"Buttonize"
                                                                    style:UIBarButtonItemStyleDone
                                                                   target:self
                                                                   action:@selector(buttonizeButtonTap:)];
self.navigationItem.rightBarButtonItems = @[buttonizeButton];

OK, zauważ, że selektorem jest buttonizeButtonTap:. Więc napisz do tego metodę void button i w ramach tej metody wywołasz segue w następujący sposób:

-(void)buttonizeButtonTap:(id)sender{
    [self performSegueWithIdentifier:@"Associate" sender:sender];
    }

Parametr sender jest wymagany do identyfikacji przycisku podczas wywoływania preparedforsegue. prepareForSegue to metoda frameworkowa, w której utworzysz instancję swojej sceny i przekaż jej dowolne wartości, które będą potrzebne do wykonania swojej pracy. Oto jak wygląda moja metoda:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"Associate"])
    {
        TranslationQuizAssociateVC *translationQuizAssociateVC = [segue destinationViewController];
        translationQuizAssociateVC.nodeID = self.nodeID; //--pass nodeID from ViewNodeViewController
        translationQuizAssociateVC.contentID = self.contentID;
        translationQuizAssociateVC.index = self.index;
        translationQuizAssociateVC.content = self.content;
    }
}
Ok, po prostu przetestowałem i działa. Mam nadzieję, że ci to pomoże.
 342
Author: smileBot,
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-06-09 18:35:21

Używam tego kodu, aby utworzyć instancję mojej niestandardowej podklasy segue i uruchomić ją programowo. Wygląda na to, że działa. Coś w tym złego? Jestem zdziwiony, czytając wszystkie inne odpowiedzi mówiące, że nie można tego zrobić.

UIViewController *toViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"OtherViewControllerId"];
MyCustomSegue *segue = [[MyCustomSegue alloc] initWithIdentifier:@"" source:self destination:toViewController];
[self prepareForSegue:segue sender:sender];
[segue perform];
 79
Author: Jean-Philippe Pellet,
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-05-23 09:51:46

Zgaduję, że to jest Odpowiedź i akceptowane, ale chciałbym tylko dodać kilka więcej szczegółów do niego.

Co zrobiłem, aby rozwiązać problem, w którym chciałbym przedstawić login-view jako pierwszy ekran, a następnie chciał segue do aplikacji, Jeśli login były poprawne. Utworzyłem segue z kontrolera login-view do kontrolera widoku głównego i nadałem mu identyfikator w stylu "myidentifier".

Następnie po sprawdzeniu całego kodu logowania jeśli login był poprawny zadzwoniłbym

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

Mój największy nieporozumienie polegało na tym, że próbowałem umieścić segue na guziku i jakby przerwać segue po znalezieniu.

 44
Author: qrikko,
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
2012-05-15 13:55:16

Musisz połączyć swój kod z UIStoryboard, którego używasz. Upewnij się, że wejdziesz do YourViewController w swoim UIStoryboard, Kliknij na obramowanie wokół niego, a następnie ustaw jego pole identifier na NSString, które wywołujesz w swoim kodzie.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" 
                                                     bundle:nil];
YourViewController *yourViewController = 
 (YourViewController *)
  [storyboard instantiateViewControllerWithIdentifier:@"yourViewControllerID"];
[self.navigationController pushViewController:yourViewController animated:YES];
 31
Author: Jeff Grimes,
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-09-08 11:51:35

Dla kontrolerów, które są w storyboardzie.

Jhilgert00 tego szukałeś?
-(IBAction)nav_goHome:(id)sender {
UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"HomeController"];
[self.navigationController pushViewController: myController animated:YES];

}

Lub...

[self performSegueWithIdentifier:@"loginMainSegue" sender:self];
 16
Author: user1723341,
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
2012-12-20 21:15:47

Cóż, możesz tworzyć, a także podklasować UIStoryBoardSegue . podklasowanie jest najczęściej używane do nadawania niestandardowej animacji przejścia.

Możesz zobaczyć wideo z wwdc 2011 przedstawiające StoryBoard. jest również dostępny w serwisie youtube.

Http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIStoryboardSegue_Class/Reference/Reference.html#//apple_ref/occ/cl/UIStoryboardSegue

 3
Author: Jogi Thakur,
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
2012-06-12 09:12:04

Chciałbym dodać wyjaśnienie...

Powszechnym nieporozumieniem, w rzeczywistości, które miałem przez jakiś czas, jest to, że segue storyboard jest wyzwalany przez metodę prepareForSegue:sender:. Nie jest. Storyboard segue wykona, niezależnie od tego, czy zaimplementowałeś metodę prepareForSegue:sender: dla tego (odchodzącego od) kontrolera widoku.

Nauczyłam się tego z doskonałych wykładów Paula Hegarty ' ego z iTunesU[8]. Przepraszam, ale niestety nie pamiętam, który wykład.

Jeśli połączysz segue pomiędzy dwoma kontrolerami widoku w storyboardzie, ale nie zaimplementuj metody prepareForSegue:sender:, segue nadal będzie segue do kontrolera widoku docelowego. Będzie to jednak segue do tego kontrolera widoku nieprzygotowany.

Mam nadzieję, że to pomoże.
 3
Author: andrewbuilder,
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-02-03 01:36:24

Segmenty scenorysów nie mogą być tworzone poza scenorysem. Będziesz musiał go podłączyć, pomimo wad.

Uistoryboardsegue Reference wyraźnie stwierdza:

Nie tworzysz bezpośrednio obiektów segue. Zamiast tego storyboard runtime tworzy je, gdy musi wykonać segue pomiędzy dwoma widokami Kontrolery. Można jeszcze zainicjować segue programowo za pomocą performSegueWithIdentifier:sender: method of UIViewController if you chcę. Można to zrobić, aby zainicjować segue ze źródła, które zostało dodane programowo i dlatego nie jest dostępny w Interface Builder.

Nadal możesz programowo powiedzieć storyboardowi, aby zaprezentował kontroler widoku za pomocą segue przy użyciu wywołań presentModalViewController: lub pushViewController:animated:, ale będziesz potrzebował instancji storyboardu.

Możesz wywołać UIStoryboardmetodę klasy S, aby uzyskać nazwany storyboard z bundle nil Dla pakietu głównego.

storyboardWithName:bundle:

 3
Author: Cameron Lowell Palmer,
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-22 07:43:51

Po pierwsze, załóżmy, że masz dwa różne widoki w storyboardzie i chcesz poruszać się z jednego ekranu na drugi, więc wykonaj następujące kroki:]}

1). Zdefiniuj wszystkie widoki za pomocą pliku klasy, a także identyfikatora storyboard w Inspektorze tożsamości.

2). Upewnij się, że dodałeś kontroler nawigacji do pierwszego widoku. Wybierz go w Storyboardzie ,a następnie Editor > Embed In > Navigation Controller

3). W pierwszej klasie zaimportuj " secondClass.h "

#import "ViewController.h
#import "secondController.h"

4). Dodaj to polecenie w IBAction, który musi wykonać segue

secondController *next=[self.storyboard instantiateViewControllerWithIdentifier:@"second"];
[self.navigationController pushViewController:next animated:YES];

5). @"second" jest klasą kontrolera secondview, storyboard id.

 2
Author: Sanket Chauhan,
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-11-07 16:25:15

I odwrócony inżynierii i wykonane open source (re)implementacji Segues UIStoryboard: https://github.com/acoomans/Segway

Za pomocą tej biblioteki można definiować segmenty programowo (bez żadnego storyboardu).

Mam nadzieję, że to pomoże.

 1
Author: acoomans,
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-02-19 09:29:32

Kilka problemów, właściwie:

Po pierwsze, w tym projekcie, który nam przesłałeś, segue nie nosi identyfikatora "segue1":

Brak identyfikatora

Powinieneś wypełnić ten identyfikator, jeśli jeszcze tego nie zrobiłeś.

Po drugie, podczas przesuwania widoku tabeli do widoku tabeli, wywołujesz initWithNibName, aby utworzyć kontroler widoku. Naprawdę chcesz użyć instantiateViewControllerWithIdentifier.

 0
Author: jaydip,
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-10-31 10:15:31

Oto przykład kodu dla Creating a segue programmatically:

class ViewController: UIViewController {
    ...
    // 1. Define the Segue
    private var commonSegue: UIStoryboardSegue!
    ...
    override func viewDidLoad() {
        ...
        // 2. Initialize the Segue
        self.commonSegue = UIStoryboardSegue(identifier: "CommonSegue", source: ..., destination: ...) {
            self.commonSegue.source.showDetailViewController(self.commonSegue.destination, sender: self)
        }
        ...
    }
    ...
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // 4. Prepare to perform the Segue
        if self.commonSegue == segue {
            ...
        }
        ...
    }
    ...
    func actionFunction() {
        // 3. Perform the Segue
        self.prepare(for: self.commonSegue, sender: self)
        self.commonSegue.perform()
    }
    ...
}
 0
Author: jqgsninimo,
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-07-03 03:02:42