it-swarm.com.de

Alternative Möglichkeiten zum programmgesteuerten Pushen von View-Controllern mit Storyboard

Ich suche nach alternativen Möglichkeiten, um Controller für die Push-Ansicht programmgesteuert im Storyboard zu instanziieren. Ich habe tatsächlich zwei Möglichkeiten gefunden, mit denen ich zur nächsten Ansicht, aber auch zur vorherigen Ansicht zurückkehren kann:

  1. mit pushViewController:

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil]; 
    LocationWebView *lvc = [storyboard instantiateViewControllerWithIdentifier:@"LocationWebView"];
    [self.navigationController pushViewController:lvc animated:YES];
    
  2. Segue programmatisch ausführen:

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

Haben Sie einige Hinweise zu Alternativen und zur optimalen Durchführung dieser Operation? Beachten Sie, dass ich mich nicht auf modale Ansichten beziehe.

57
yassassin

Apple empfiehlt die Verwendung von performSegueWithIdentifier:sender:someObject, Um programmgesteuert Segues auszuführen. Es gibt mindestens ein paar Vorteile, wenn man es so macht:

  • Weniger eigener Code bedeutet, dass das Framework mehr Arbeit leistet. Wenn Apple einen supercoolen neuen visuellen Effekt für Push-Segmente entwickelt, die Leistung verbessert oder einen Fehler in einer zukünftigen iOS-Version behebt, kann Ihre App ihn kostenlos herunterladen. Und für jede Zeile Der Code, den Sie schreiben, um die Arbeit zu erledigen, die das Framework für Sie tun könnte, erhöht die Wahrscheinlichkeit, Fehler zu schreiben.

  • Mehr in IB kann einfacher zu ändern sein. Wenn Sie beschließen, alle Push-Segmente in modale Segmente oder einen benutzerdefinierten Segmenttyp zu ändern, bei dem Sie einen eigenen, supercoolen visuellen Effekt erzielen, können Sie sie alle in IB auswählen und den Segmenttyp mit einem Klick ändern, anstatt zu jagen in Ihrem Code herum.


Unabhängig davon, ob Sie die erste oder die zweite Methode verwenden, funktioniert das Drücken eines Ansichtscontrollers, um zu einem vorherigen Ansichtscontroller zurückzukehren, nicht so, wie es Ihre Benutzer erwarten. Wenn Sie ein SongViewController verschieben, wird es am Ende des Navigationsstapels hinzugefügt:

LocationViewController -> SongViewController

Wenn Sie dann noch einmal LocationViewController drücken, um "zurück" zu gehen:

LocationViewController -> SongViewController -> LocationViewController

Wenn der Benutzer auf die Schaltfläche "Zurück" in der Navigationsleiste tippt, wechselt er wieder von der Positionsansicht zur Songansicht zur Positionsansicht. (Wenn Sie dies weiterhin tun, wird jedes "Zurück" und "Vorwärts" zu einer ständig wachsenden Kette von Ansichtskontrollern hinzugefügt, was zu anderen Problemen führen kann.)

Stattdessen sollten Sie den Navigationscontroller das Zurückgehen überlassen. Zu diesem Zweck wird in der Navigationsleiste eine Schaltfläche eingefügt, die die meisten Anwendungsfälle behandeln sollte. Wenn Sie Ihre eigene Steuerung vornehmen müssen, um zurückzukehren, können Sie dies in IB mit iOS 5 nicht tun, aber Sie können dies programmgesteuert mit der popViewControllerAnimated: - Methode des Navigationscontrollers tun.

36
rickster

Persönlich verwende ich die Nummer 2, wenn ich mich in einem UIViewController befinde, der sich unter einem UINavigationController befindet. Ich glaube nicht, dass es funktionieren wird, da es keinen UINavigationController gibt.

Wenn ich eine Ansicht verwende, die sich unter einem UITabBarController befindet, verwende ich den folgenden Code, um zu einer anderen Registerkarte zu wechseln:

NSUInteger tabIndex = 2; // Index of the tab I want to select
UIViewController * viewCtrl = [_tabController.viewControllers objectAtIndex:tabIndex];
_tabController.selectedViewController = viewCtrl;
4
gfrigon