2013-09-22 20 views
42

Ich muss nur wissen, wie man eine 'bedingte' Weiterleitung/Überleitung zu einer Ansicht macht. Beispiel:Bedingtes Segue mit Storyboard

Wenn sich der Benutzer noch nicht angemeldet hat, wird eine Ansicht mit dem Anmeldeformular angezeigt. Wenn sich der Benutzer jedoch bereits angemeldet hat, wird seine Profilansicht angezeigt.

Wie bedingte Übergänge wie das Storyboard machen?

Danke

Antwort

68

Bei bedingten Übergängen sollten Sie nicht wie gewöhnlich einen Übergang von einer Schaltfläche aus starten. davon Statt die folgenden Schritte aus:

  1. In Ihrem storyboad, starten Sie eine segue direkt von der Quelle-View-Controller an das Ziel-View-Controller. Dazu können Sie das Symbol des Quellansicht-Controllers in der Leiste direkt unterhalb der Ansicht auf den Zielansicht-Controller im Hauptfensterbereich ziehen. Denken Sie daran, dass Sie zwei View-Controller direkt und nicht mit einem Steuerelement verbinden müssen.

  2. Geben Sie eine geeignete Überleitungskennung für diesen Abschnitt ein. Zum Beispiel sagen: „conditionSegue“

  3. nun in Ihrer Quelle .m Datei-View-Controller Ihr Zustand durchführen und -performSegueWithIdentifier:sender: Methode auf „Selbst“ wie folgt aufrufen:

    -(void)loadDestinationVC{ 
        if(condition == YES){ 
    
         [self performSegueWithIdentifier:@"conditionSegue" sender:nil]; 
        } 
    } 
    

Ich hoffe, dass ich es gemacht klar.

+0

Es dein arbeitete für mich, ich habe eine conditionall segue von einem UITableViewCell, weil einige andere Zellen eine Ansicht und anderen Zellen zu zeigen, hat ... Die Sache ist dass, wenn ich vom Push-Segment zurückkomme, es den Fokus verloren hat und die Ansicht zurücksetzt, kommt es nicht zurück zu der Zelle, die die Aktion gestartet hat. Ich habe eine Tabellenansicht mit einem segmentierten Steuerelement, das zwischen 2 Datenquellen wechselt. Wenn ich aus einer uitableviewcell mit dem zweiten Index des segmentierten Steuerelements wechsle, wenn ich vom Segment zurückkomme, startet es die Ansicht mit dem ersten Index am segmentierten Steuerelement ... – fguespe

+0

@fguespe Sie fragen nach einer Lösung für das Problem oder ist es ein allgemeiner Kommentar. –

+0

ja, ich brauche eine lösung, aber ich bin ein bisschen fortgeschritten und ich verstehe, ist nicht schuld an der bedingten überfahrt. für normale Übergänge passiert. Das Problem ist das segmentierte Steuerelement, das nach dem Index sucht, wenn es zurückkommt, aber es zeigt die ersten Segmentdaten an. – fguespe

3

Sie die segues von einem Controller zum anderen direkt machen (oder andere), und sie Identifikatoren geben. In Code, den Sie aufrufen, wählen Sie abhängig von Ihren Bedingungen zwischen den Segmenten aus und rufen performSegueWithIdentifier auf: sender :.

14

Ich glaube, einen besseren Ansatz, wenn Sie segues von Schaltflächen verwenden möchten, wäre dies zu nutzen:

Zuerst erstellen Sie eine Schaltfläche und ein Übergang zu verwenden, um sie zu einer anderen Ansicht zu verbinden, geben diese Segue einen Namen

dann diese Methode in .m-Datei verwenden

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender { 
    if ([identifier isEqualToString:@"SegueName"]) { 
     //Check if should make the segue 
     //if not do something 
     [self doSomething]; 
     //and return NO; 
     return NO; 
    } 
    return YES; 
    } 
+0

Wenn Sie xcode 6 verwenden und sich nicht sicher sind, welche Art von Seagang verwendet werden soll, können Sie den "Show" -Absatz unter "Action Sague" verwenden. Um dem Seagat einen Bezeichner (Namen) zu geben, wählen Sie ihn im Storyboard aus und geben Sie den gewünschten Namen im Feld "Bezeichner" unter dem Inspektor "Attribute" (rechts) ein. –

1

erstellen „generic“ segue durch Abfrage aus dem view-Controller-Symbol am unteren Rand zu dem Ziel ziehen. Dieser Übergang wird keiner Aktion zugeordnet. Dann in Ihrem Code, wo immer der Fall, dass Ihr bedingten Code verwendet, dass Sie die Segue auslösen wollen, rufen:

- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender 
6

In Swift könnten Sie tun: als @Gaurav Singh in seiner Antwort vorgeschlagen

Schritt 1: Fügen Sie einen Übergang von ViewControllerA zu ViewControllerB ein. Das Segment sollte von ViewControllerA selbst starten und nicht von einem Steuerelement (wie Button) darin.

Schritt 2: Geben Sie segue einen eindeutigen Bezeichner im Storyboard. Beispiel: seageFromAtoB

Schritt 3: In Ihrem ViewControllerforA.swift schreiben:

if(condition == true) { 
    self.performSegueWithIdentifier("seageFromAtoB", sender: self) 
} 

Wenn Sie eine bestimmte Aufgabe in einem anderen Thread ausführen dann performSegueWithIdentifier verwendet, kann eine Ausnahme auslösen.

Wenn Sie diesen Fehler erhalten, dann sollten Sie verwenden:

if(condition==true){ 
     NSOperationQueue.mainQueue().addOperationWithBlock { 
      self.performSegueWithIdentifier("seageFromAtoB", sender: self) 
     } 
} 

Dies wird segue Umleitung in Haupt Thread auszuführen.

Hoffnung diese Hilfe für jemanden für Swift Option suchen