wake-up-neo.com

Storyboard-Segue Vom Ansichts-Controller zu sich selbst

Ich versuche, einen Mechanismus zu erstellen, um eine Datei-/Ordnerliste aufzurufen. Die Idee ist, den gleichen Dateilisten-Ansichts-Controller jedes Mal anzuzeigen, wenn der Benutzer einen Ordner auswählt, und einen Datei-Detailansicht-Controller anzuzeigen, wenn er eine Datei auswählt.

Bisher habe ich ein Segment vom Dateilistenansicht-Controller zum Dateidetailansicht-Controller und ein Segment aus der Dateilistentabelle der Tabellensicht zum Dateilistentabellen-Controller erstellt:

 enter image description here

Das Problem dabei ist, dass, sobald der Benutzer die Zelle antippt, das Segment ausgeführt wird. Ich möchte das Segment aus der Tabellensichtzelle entfernen und aus dem Dateilisten-Ansichts-Controller einen zu sich selbst machen. Auf diese Weise konnte ich die richtige Auswahl programmgesteuert auslösen, wenn der Benutzer die Zelle antippte.

Meine Frage ist also: Ist es möglich, im Interface Builder ein Segment von einem View-Controller zu sich selbst zu erstellen?

72
Jorge

Ich entwickelte eine Methode zum Erstellen eines Segments mithilfe einer Phantomtaste. Ich glaube, es wird dein Problem lösen. Sie können darüber in meiner Antwort hier nachlesen. 

26
T.J.

Wenn Sie einen Navigationscontroller verwenden, müssen Sie den ViewController in den Nav-Stack schieben. In diesem Beispiel habe ich meinen ViewController in meiner Storyboard-ID-Einstellung "VDI" genannt. 

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"];
[self.navigationController pushViewController:dest animated:YES];

Wenn Sie nicht möchten, dass sich der NavigationController immer wieder in Ihrem "Back" -Verlauf befindet, können Sie den Stapel platzen lassen, bevor Sie ihn wie folgt hinzufügen.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"];
UINavigationController *navController = self.navigationController;
[navController popViewControllerAnimated:NO];
[navController pushViewController:dest animated:YES];
42
Jim True

Mit Xcode 5 gibt es eine einfachere Lösung von much.

  1. Klicken Sie im Storyboard auf die Tabellenzelle
  2. Öffnen Sie den Inspektor für Verbindungen (rechtes Pfeilsymbol oben rechts).
  3. Unter "ausgelöste Segmente" wird "Auswahl" angezeigt.
  4. Ziehen Sie aus dem Kreis neben "Auswahl" in die Zelle im Storyboard

Das ist es. 

28
John Henckel

Anstatt einen Übergang zu demselben Controller durchzuführen, können Sie einen Ansichtscontroller (denselben Controller) vom Storyboard aus instanziieren und dann auf den Navigationscontroller verschieben.

23
Mustafa

In IOS 6 gibt es eine sauberere Lösung als die Verwendung einer Phantomtaste. Sie können immer noch das Segment von der Tabellenzelle zum View-Controller definieren und den Sender betrachten, um das automatisch ausgelöste Segment abzubrechen:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    //storyboards should use segues and override prepareForSegue instead
    //but here we need custom logic to determine which segue to use
    id item = [self.fetchedResultsController objectAtIndexPath:indexPath];
    if (item meets condition) {
        [self performSegueWithIdentifier:@"segue1" sender:self];
    } else {
        [self performSegueWithIdentifier:@"segue2" sender:self];
    }
}

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    //ignore segue from cell since we we are calling manually in didSelectRowAtIndexPath
    return (sender == self);
}
13
Chris

Interface Builder-Ansatz: Wechseln Sie einfach zu einer Storyboard-Referenz, die auf den präsentierenden View-Controller verweist.

11

Die richtige Antwort ist, eine Storyboard-Referenz zu verwenden, die auf den UIViewController verweist, den Sie auf sich selbst zeigen möchten, und dann das Segment darauf zeigen.

 enter image description here

9
Sethmr

So können Sie eine andere Instanz des aktuellen View-Controllers pushen, ohne ein Segment zu definieren oder einen eigenen Bezeichner zu kodieren:

SameViewController *same = [self.storyboard instantiateViewControllerWithIdentifier: self.restorationIdentifier];
[self.navigationController pushViewController: same animated: YES];

Sie müssen nur die Wiederherstellungs-ID so einstellen, dass sie mit der Storyboard-ID identisch ist (es gibt ein Ankreuzfeld in IB).

 Restoration ID

4
Tomas Andrle

Hoffe das hilft.

Ich habe festgestellt, dass Sie mehrere Prototypzellen erstellen können.

Dann können Sie jede Zelle (im Storyboard) mit einer anderen Ansicht verknüpfen.

Etwas wie das:

NSString *CellIdentifier = @"Cell"; 
if (Condition2 ){
CellIdentifier = @"Cell2"; } 
if (Condition3 ){
CellIdentifier = @"Cell3"; }
0
Yari