Best practice Navigationstack

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

  • Best practice Navigationstack

    Hi,

    ich habe folgendes Konstrukt:

    Einen NavigationController mit einem TableView. Wird dort eine Zelle angeklickt wird ein ViewController gepusht welcher eine Suchmaske beinhaltet. Hier kann man nun Suchkriterien eingeben und dann auf "Suchen" Klicken. Wird die Suche gestartet wird ein weiterer TableViewController gepusht in dem die Suchergebnisse angezeit werden. Soweit ganz easy.

    Ich muss nun aber die Möglichkeit haben, das wenn man in den Suchergebnissen eine Zelle enklickt, zurückgesprungen wird zum ersten ViewController und der braucht diese Daten.

    Im Moment habe ich sowohl dem SuchmaskenViewController als auch dem ErgebnisViewController ein Delegate verpasst, welches dann bei der Auswahl eines Ergebnisses dieses zurückreicht an den ersten ViewController. Weiterhin dachte ich, ich könnte dann einfach im ersten ViewController in der Delegate.Methode des SuchViewControllers ein

    [self.navigationController popToViewController:self animated:YES]

    machen um zum ersten ViewController zurück zu kehren. Ich erhalte aber eine Exception

    *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Tried to pop to a view controller that doesn't exist.'

    Habe ich da einen generellen Denkfehler oder gibt es eventuell sogar noch einen schöneren Weg das Abzubilden, denn so 100% toll finde ich das Konzept eigentlich nicht.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • macmoonshine schrieb:

    Die Idee mit dem Delegate finde ich nicht schlecht. Allerdings sollte nicht das Delegate den Rücksprung ausführen sondern allenfalls genehmigen (z. B. sowas wie xyControllerShouldFinish:). Eine andere elegante Rücksprungmöglichkeit, auch über mehrere Ebenen hinweg, sind Unwind-Segues.


    Hi Moon,

    das Problem ist ja, das ich zwei ViewController zumachen muss. Wenn das Delegate nur Bescheid sagen würde, dann müßte der erste ViewController ja irgendwie eine Referenz auf den letzten ViewController haben damit er ihm bescheid sagen kann und der letzte müßte eine Referenz auf den ersten haben, damit er weiß wohin er zurückpoppen muss. Beides ist ja erstmal nicht gegeben und ich fände es auch nicht schön da die beiden ja eigentlich nichts miteinander zu tun haben. Wenn dann könnte ich das nur über Notifications machen aber selbst dann würden der letzte und der erste ViewController wieder in Abhängigkeit stehen mehr oder weniger.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    [self.navigationController popToViewController:self animated:YES]

    machen um zum ersten ViewController zurück zu kehren. Ich erhalte aber eine Exception

    *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Tried to pop to a view controller that doesn't exist.'

    Interessant, wäre mir neu, dass dies nicht mehr funktioniert.

    Hast Du mal per NSLog die aktuellen ViewController (viewControllers) auf dem NavigationStack ausgegeben?
  • Thallius schrieb:

    das Problem ist ja, das ich zwei ViewController zumachen muss. Wenn das Delegate nur Bescheid sagen würde, dann müßte der erste ViewController ja irgendwie eine Referenz auf den letzten ViewController haben damit er ihm bescheid sagen kann und der letzte müßte eine Referenz auf den ersten haben, damit er weiß wohin er zurückpoppen muss. Beides ist ja erstmal nicht gegeben und ich fände es auch nicht schön da die beiden ja eigentlich nichts miteinander zu tun haben. Wenn dann könnte ich das nur über Notifications machen aber selbst dann würden der letzte und der erste ViewController wieder in Abhängigkeit stehen mehr oder weniger.


    Genau das kannst Du über Unwind-Segues lösen.
    „Meine Komplikation hatte eine Komplikation.“
  • Die Views werden so gut wie alle dynamisch aufgebaut. Von daher ist ein Storyboard hier eigentlich nicht praktisch und wird bisher auch nicht benutzt.

    @dan Ich hatte bisher noch keine Zeit das weiter zu debuggen. Werde ich nachher machen. Ist was anderes dazwischen gekommen. Wenn es generell gehen soll, wovon ich ja eigentlich auch ausgegangen bin, werde ich den fehler wohl irgendwie finden. Ich wollte nur nicht einem Gespenst hinterher laufen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Also ich kapier das nicht.

    Wie kann ich das weiter debuggen?

    Der Aufbau ist echt trvial:

    UITabeViewController (sourceViewController) auf NavigationStack ruft einen UIVIewController (Suche) auf mit

    [self.navigationController pushViewController:sucheController animated:YES];

    Dieser wiederrum ruft einen UITableViewController (Ergebnisse) auf mit gleichem Befehl.

    Ich habe nun den sourcetViewController einfach mal als strong property an den SucheController weiter gegeben und der hat dann diesen, ebenfalls als strong property, an den ErgebnisViewController weitergegeben. Im ErgebnisViewController mache ich beim didSelectCellForIndexPath jetzt ein

    [self.navigationController popToViewController:self.sourceViewController animated:YES];

    und es stürz ab mit dem Fehler das zu einem ViewController gepoppt werden woll den es nicht gibt...

    Im Moment steh ich komplett auf dem Schlauch...

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Unter welcher iOS Version tritt dieses Problem auf?

    Kannst Du die App evtl. mal im Simulator unter iOS 6.x testen?

    Ich habe dies schon mehrfach verwendet und hatte bisher (bis iOS 6.x) keine Probleme damit. Evtl. hat Apple da in iOS 7 etwas geändert bzw. ist dies jetzt ein hidden Feature (Bug).
  • Argl ich habe es gefunden.

    Habe mich selber verarscht. Im ViewController vor dem SucheController, also dahin wohin er springen soll wenn ein Ergenis gewählt wurde habe ich einen ChildViewController in einem ScrollViewController. Den habe ich dann weiter gegeben. Das kann natürlich nicht klappen. Jetzt habe ich den ScrollViewConbtroller weiter gegeben und nun gehts.

    Danke fürs mitgrübeln

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)