Per Definition kann ein Segue nicht wirklich unabhängig von einem Storyboard existieren. Es ist sogar dort im Namen der Klasse : UIStoryboardSegue
. Sie erstellen Segues nicht programmgesteuert - es ist die Storyboard-Laufzeit, die sie für Sie erstellt. Normalerweise können performSegueWithIdentifier:
Sie den Code Ihres View Controllers aufrufen. Dies setzt jedoch voraus, dass im Storyboard bereits ein Abschnitt eingerichtet ist, auf den verwiesen wird.
Ich denke, Sie fragen sich jedoch, wie Sie in Ihrem gemeinsamen Ansichts-Controller (Basisklasse) eine Methode erstellen können, die zu einem neuen Ansichts-Controller übergeht und von allen abgeleiteten Klassen geerbt wird. Sie können dies tun, indem Sie eine Methode wie diese für Ihren Basisklassen-Ansichtscontroller erstellen:
- (IBAction)pushMyNewViewController
{
MyNewViewController *myNewVC = [[MyNewViewController alloc] init];
// do any setup you need for myNewVC
[self presentModalViewController:myNewVC animated:YES];
}
Rufen Sie dann in Ihrer abgeleiteten Klasse diese Methode auf, wenn Sie auf die entsprechende Schaltfläche klicken oder die Tabellenzeile ausgewählt ist oder was auch immer.
UIViewController
Methode verwendenperformSegueWithIdentifier:sender:
.UIView
‚spresentModalViewController:animated:
ist veraltet. Aus den Dokumenten - (In iOS 6.0 veraltet. Verwenden Sie presentViewController: animiert: Abschluss: stattdessen.)Ich dachte, ich würde eine weitere Möglichkeit hinzufügen. Sie können unter anderem zwei Szenen in einem Storyboard mithilfe eines Segues verbinden, das nicht an eine Aktion angehängt ist, und dann den Segue programmgesteuert in Ihrem View Controller auslösen. Die Art und Weise, wie Sie dies tun, besteht darin, dass Sie vom Eigentümer-Symbol der Datei am unteren Rand der Storyboard-Szene, die die Segue-Szene darstellt, ziehen und nach rechts in die Zielszene ziehen müssen. Ich werde ein Bild einwerfen, um es zu erklären.
Ein Popup wird für "Manual Segue" angezeigt. Ich habe Push als Typ gewählt. Tippen Sie auf das kleine Quadrat und stellen Sie sicher, dass Sie sich im Attributinspektor befinden. Geben Sie ihm eine Kennung, mit der Sie im Code darauf verweisen.
Ok, als nächstes gehe ich mit einem programmgesteuerten Balkenschaltflächenelement über. In viewDidLoad oder anderswo erstelle ich ein Schaltflächenelement in der Navigationsleiste mit folgendem Code:
Ok, beachten Sie, dass der Selektor buttonizeButtonTap: ist. Schreiben Sie also eine void-Methode für diese Schaltfläche, und innerhalb dieser Methode rufen Sie den Segue wie folgt auf:
Der Absenderparameter ist erforderlich, um die Schaltfläche beim Aufruf von prepareForSegue zu identifizieren. prepareForSegue ist die Framework-Methode, mit der Sie Ihre Szene instanziieren und ihr alle Werte übergeben, die sie für ihre Arbeit benötigt. So sieht meine Methode aus:
Ok, habe es gerade getestet und es funktioniert. Hoffe es hilft dir.
quelle
Ich habe diesen Code verwendet, um meine benutzerdefinierte Segue-Unterklasse zu instanziieren und programmgesteuert auszuführen. Es scheint zu funktionieren. Stimmt etwas damit nicht? Ich bin verwirrt und lese alle anderen Antworten, die besagen, dass dies nicht möglich ist.
quelle
UIStoryboardSegue
.performSegueWithIdentifier:
wirklich im Storyboard definiert ist. Ich vermeide alle Probleme, wenn ich den Segue selbst erstelle.Ich denke, dies wird beantwortet und akzeptiert, aber ich möchte nur ein paar weitere Details hinzufügen.
Was ich getan habe, um ein Problem zu lösen, bei dem ich eine Anmeldeansicht als ersten Bildschirm präsentierte und dann zur Anwendung wechseln wollte, wenn die Anmeldung korrekt war. Ich habe den Übergang vom Login-View-Controller zum Root-View-Controller erstellt und ihm eine Kennung wie "myidentifier" gegeben.
Nachdem ich den gesamten Anmeldecode überprüft hatte, ob die Anmeldung korrekt war, würde ich anrufen
Mein größtes Missverständnis war, dass ich versucht habe, den Segue auf einen Knopf zu drücken und den Segue zu unterbrechen, sobald er gefunden wurde.
quelle
Sie müssen Ihren Code mit dem Code verknüpfen, den
UIStoryboard
Sie verwenden. Stellen Sie sicher, dass Sie in YourViewController in Ihren gehenUIStoryboard
, auf den Rand um ihn herum klicken und dann dasidentifier
Feld auf ein Feld setzen,NSString
das Sie in Ihrem Code aufrufen.quelle
Für Controller, die sich im Storyboard befinden.
jhilgert00 ist das was du gesucht hast?
ODER...
quelle
Nun, Sie können die UIStoryBoardSegue erstellen und auch in Unterklassen unterteilen. Unterklassen werden hauptsächlich für benutzerdefinierte Übergangsanimationen verwendet.
Sie können das Video von wwdc 2011 sehen, in dem StoryBoard vorgestellt wird. Es ist auch in Youtube verfügbar.
http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIStoryboardSegue_Class/Reference/Reference.html#//apple_ref/occ/cl/UIStoryboardSegue
quelle
Ich möchte eine Klarstellung hinzufügen ...
Ein häufiges Missverständnis, das ich seit einiger Zeit hatte, ist, dass durch die
prepareForSegue:sender:
Methode ein Storyboard-Übergang ausgelöst wird . Es ist nicht. Ein Storyboard-Übergang wird ausgeführt, unabhängig davon, ob Sie eineprepareForSegue:sender:
Methode für diesen (abweichenden) Ansichts-Controller implementiert haben .Das habe ich aus Paul Hegartys hervorragenden iTunesU-Vorträgen gelernt . Ich entschuldige mich aber leider nicht daran welche Vorlesung.
Wenn Sie einen Abschnitt zwischen zwei Ansichts-Controllern in einem Storyboard verbinden, aber keine
prepareForSegue:sender:
Methode implementieren , wird der Abschnitt weiterhin mit dem Ziel-Ansichts-Controller getrennt. Es wird jedoch unvorbereitet zu diesem Ansichts-Controller übergehen.Hoffe das hilft.
quelle
Storyboard-Segues dürfen nicht außerhalb des Storyboards erstellt werden. Sie müssen es trotz der Nachteile verkabeln.
In der UIStoryboardSegue-Referenz heißt es eindeutig:
Sie können das Storyboard weiterhin programmgesteuert anweisen, einen Ansichts-Controller mithilfe eines Segue mit
presentModalViewController:
oder mitpushViewController:animated:
Aufrufen anzuzeigen. Sie benötigen jedoch eine Storyboard-Instanz.Sie können die
UIStoryboard
Klassenmethode s aufrufen , um ein benanntes Storyboard mit dem Bundle nil für das Hauptpaket zu erhalten.storyboardWithName:bundle:
quelle
Angenommen, Sie haben zwei verschiedene Ansichten im Storyboard und möchten von einem Bildschirm zum anderen navigieren. Gehen Sie also folgendermaßen vor:
1). Definieren Sie alle Ihre Ansichten mit der Klassendatei und der Storyboard-ID im Identitätsinspektor.
2). Stellen Sie sicher, dass Sie der ersten Ansicht einen Navigationscontroller hinzufügen. Wählen Sie es im Storyboard und dann Editor> Einbetten> Navigations-Controller
3). Importieren Sie in Ihrer ersten Klasse die "secondClass.h"
4). Fügen Sie diesen Befehl in die IBAction ein, die die Übergabe ausführen muss
5).
@"second"
ist die Secondview-Controller-Klasse, Storyboard-ID.quelle
self.storyboard
sollte sein:UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
storyboardWithName:@"Main"
[self showDetailViewController:next sender:self];
oder[self showViewController:next sender:self];
Ich habe die Open-Source-Implementierung der UIStoryboard-Segmente rückentwickelt und (neu) implementiert: https://github.com/acoomans/Segway
Mit dieser Bibliothek können Sie Segmente programmgesteuert definieren (ohne Storyboard).
Hoffe es kann helfen.
quelle
Eigentlich ein paar Probleme:
Erstens trägt in diesem Projekt, das Sie für uns hochgeladen haben, der Segue nicht die Kennung "segue1":
keine Kennung
Sie sollten diese Kennung eingeben, falls Sie dies noch nicht getan haben.
Zweitens rufen Sie beim Wechseln von Tabellenansicht zu Tabellenansicht initWithNibName auf, um einen Ansichtscontroller zu erstellen. Sie möchten wirklich instantiateViewControllerWithIdentifier verwenden.
quelle
Hier ist das Codebeispiel für
Creating a segue programmatically
:quelle
self.prepare(for: self.commonSegue, sender: self)
von Ihrer Aktionsmethode aus auf. Was ist dann der Punkt des Vergleichsif self.commonSegue == segue {...}
inprepare(for:sender)
Methode?prepare(for:sender:)
können Sie den Zielansichts- Controller konfigurieren, bevor er angezeigt wird. Natürlich können Sie es auch in tunactionFunction
.