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.
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.
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.
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ć.
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.
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.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];
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.
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];
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];
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.
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.
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.
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ć UIStoryboard
metodę klasy S, aby uzyskać nazwany storyboard z bundle nil Dla pakietu głównego.
storyboardWithName:bundle:
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.
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.
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.
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()
}
...
}
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