TableVC soll sich über ein segue selbst aufrufen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • TableVC soll sich über ein segue selbst aufrufen

    Die Überschrift sagt es hoffentlich schon ein wenig aus. Ich bastle seit ein paar Tagen an einer App und bin hier auch schon auf wirklich freundliche Hilfe gestoßen.

    Heute habe ich eine neue Frage bzgl. Storyboard, Segues, TableViews und warum wir eigentlich keinen richtigen Sommer haben.

    Meine App, ausgehend von einem TabbarController besteht aus mehreren im Storyboard erstellten TableViews, die alle EINE klasse "blaTableViewController" zugewiesen bekommen haben.

    Diese TableView(s) sollen mehrere Ebenen "tief" sein, sich also selbst bis zu einem gewissen Punkt aufrufen.

    Nun habe ich mir gedacht - so als Fuchs - ziehe ich diese klasse Storyboard-Linien auf die Tabelle selbst. Also erstelle ein Segue auf die eigene Tabelle (Push).
    Das klappt eigentlich auch ganz prima und sieht wie eine hübsche Schleife aus. Noch schnell einen Identifier benannt und den Programmcode aufgerufen.

    Bis dahin war ich recht siegessicher. Wie gesagt, bis dahin.

    Folgendes habe ich zu erst gemacht:
    In der Methode:

    PHP-Quellcode

    1. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    Habe ich folgendes hinzugefügt:

    PHP-Quellcode

    1. [self performSegueWithIdentifier: @"navigationSeque" sender: self];

    Natürlich wurde das ganze noch mit ein paar Abfragen gewürzt, da ja irgendwann nicht mehr das "navigationSegue" benutzt werden soll.

    Schnell noch eine weitere Methode implementiert:

    PHP-Quellcode

    1. - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    Noch kurz abfragen ob ich im gewünschten Segue bin:

    PHP-Quellcode

    1. -if([segue.identifier isEqualToString:@"navigationSeque"]){

    Hier dann mein neues Objekt aufgebaut (und zwar vom gleichen Typ wie das jetzige):

    PHP-Quellcode

    1. blaTableViewController *blavc = (blaTableViewController *)[segue destinationViewController];

    Und noch schnell einen Wert zugewiesen:

    PHP-Quellcode

    1. blavc.zackNeueID = @"666";



    Tjoa... das wars dann auch schon und die Vorfreude war auch nur von kurzer Dauer: Es passiert nämlich gar nichts.

    Es wäre klasse, wenn mir jemand unter die Arme greifen könnte :-).

    Vielen Dank im Voraus und einen schönen Sonntag!

    Florian

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von dyna ()

  • Nun, da sich diese Ansicht ja öfter wiederholt.

    Ich hole Daten über eine JSON-Schnittstelle (z.B. eine Navigation) und lasse sie im TableView anzeigen. Diese Daten beinhalten auch einen bool-Wert (und eine ID), ob es noch weitere Unterpunkte gibt. Diese Unterpunkte sind exakt so aufgebaut, wie die Punkte zuvor. Es geht also immer eine Ebene tiefer, bis zu einem gewissen Punkt an dem der bool-Wert false ist. Also keine weiteren Unterpunkte sondern eine Detailseite (oder was auch immer). Da - wie gesagt - alle Ansichten gleich aussehen und ich nicht weiß wie viele es davon gibt, soll sich der View immer selbst aufrufen.
  • "Selber aufrufen" ist vielleicht ein wenig "Falsch" gesagt wie ich finde. Du pushst ja nur einen neue Instanz der Klasse "blablablTableViewController" mittels Segue auf den Stack eines NavigationControllers

    //EDIT: Dein Ansatz ist korrekt!!! :)
    Gruß

    Robin
  • dyna schrieb:

    Ich hole Daten über eine JSON-Schnittstelle (z.B. eine Navigation) und lasse sie im TableView anzeigen. Diese Daten beinhalten auch einen bool-Wert (und eine ID), ob es noch weitere Unterpunkte gibt. Diese Unterpunkte sind exakt so aufgebaut, wie die Punkte zuvor. Es geht also immer eine Ebene tiefer, bis zu einem gewissen Punkt an dem der bool-Wert false ist. Also keine weiteren Unterpunkte sondern eine Detailseite (oder was auch immer). Da - wie gesagt - alle Ansichten gleich aussehen und ich nicht weiß wie viele es davon gibt, soll sich der View immer selbst aufrufen.

    Dieses Szenario wirst Du nur mit einem Storyboard nicht lösen können. Storyboards sind nicht wirklich für eine Variable Anzahl von ViewControllern geschaffen. Du kannst zwar so einen Seque von einem TableView auf sich selbst anlegen, aber wie willst Du dann den irgendwann notwendigen Übergang auf den DetailView machen? Einen zweiten Seque im Storyboard geht nicht. Du musst so oder so im Code aktiv werden.

    Zu Deinem Problem selbst. Das nichts passiert liegt vermutlich daran, dass Du in der Methode tableView:didSelectRowAtIndexPath: den Seque programatisch triggerst. Du hast aber doch im Storyboard den Seque schon mit der schönen Schleife angelegt. Da wird einfach was kollidieren.

    Michael
  • Ich scheue mich nicht, das ganze programmatisch zu lösen. Gänzlich möchte ich allerdings nicht auf das Storyboard verzichten. Zum "DetailView-Problem" hier war meine Idee diesen ebenfalls im Storyboard über eine zweite Segue zu verbinden und diese dann im Programmcode abzufangen.

    Aber zurück zu meinem Problem. Wie kann ich denn nun diese neue Instanz von meinem ViewController aufrufen? Muss ich den Segue im Storyboard im ersten Schritt entfernen? Und falls ja, was muss anschließend beachtet werden? So ganz erschließt es mir noch nicht.

    Vielen Dank :)
  • dyna schrieb:

    Ich scheue mich nicht, das ganze programmatisch zu lösen. Gänzlich möchte ich allerdings nicht auf das Storyboard verzichten. Zum "DetailView-Problem" hier war meine Idee diesen ebenfalls im Storyboard über eine zweite Segue zu verbinden und diese dann im Programmcode abzufangen.

    Und hast Du schon mal versucht eine zweite Segue im Storyboard anzulegen?

    dyna schrieb:

    Aber zurück zu meinem Problem. Wie kann ich denn nun diese neue Instanz von meinem ViewController aufrufen? Muss ich den Segue im Storyboard im ersten Schritt entfernen?

    Nein, lass einfach das

    Quellcode

    1. [self performSegueWithIdentifier: @"navigationSeque" sender: self];

    in der tableView:didSelectRowAtIndexPath: weg.

    Michael
  • Dann komme ich in die Funktion

    PHP-Quellcode

    1. - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender


    Ich kann auch

    PHP-Quellcode

    1. if([segue.identifier isEqualToString:@"navigationSeque"]){
    abfangen

    Ich erstelle einen View:

    PHP-Quellcode

    1. TemplateNavigationController *nvc = [segue destinationViewController];


    Aber dann... dann passiert nichts?!

    Und bzgl. Storyboard und zweiter Segue -> Oouuups. Bitte sag mir, dass es dafür auch eine Lösung (und wenn sie programmatisch ist) gibt.
  • dyna schrieb:

    Dann komme ich in die Funktion

    PHP-Quellcode

    1. - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender


    Ich kann auch

    PHP-Quellcode

    1. if([segue.identifier isEqualToString:@"navigationSeque"]){
    abfangen

    Ich erstelle einen View:

    PHP-Quellcode

    1. TemplateNavigationController *nvc = [segue destinationViewController];


    Aber dann... dann passiert nichts?!

    Ich weiß aber auch nicht, warum bei Dir nichts passiert. Die paar Zeilen Code, die Du hier gepostet hast, helfen mir nicht weiter, Dir zu helfen.

    dyna schrieb:

    Und bzgl. Storyboard und zweiter Segue -> Oouuups. Bitte sag mir, dass es dafür auch eine Lösung (und wenn sie programmatisch ist) gibt.

    Ja, es gibt eine Lösung. Du kannst im Storyboard die ViewController und Views layouten. Den Übergang zwischen den Views machst Du dann einfach im Code. Du lässt also die Segues weg. Die ViewController instanzierst Du mit instantiateViewControllerWithIdentifier:.

    Michael
  • Michael schrieb:

    Ja, es gibt eine Lösung. Du kannst im Storyboard die ViewController und Views layouten. Den Übergang zwischen den Views machst Du dann einfach im Code. Du lässt also die Segues weg. Die ViewController instanzierst Du mit instantiateViewControllerWithIdentifier:.
    Erstellt man mit der Methode nicht eine zweite Instanz des ViewControllers weil das Storyboard beim App laden schon einen instanziert?

    EDIT: ach, verlesen, ignorieren :)
    [window close]