Split View Controller Aufbau falsch

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

  • Split View Controller Aufbau falsch

    Hallo zusammen,

    ich habe mir für meine App eine Einstellungsseite gebastelt, wie man sie auch unter Einstellungen auf jedem IOS Device kennt, also mit einem SplitViewController, links die Liste der Themen, rechts die Detailansicht.
    Simuliere ich es auf einem IPad oder dem IPhone in Landscape, läuft es. Nur beim IPhone im Portrait Mode schmiert die App ab und bringt folgenden Fehler:


    Split View Controllers cannot be pushed to a Navigation Controller <UIMoreNavigationController: 0x7fc58b836600>

    Im Anhang hab ich mal noch ein Bild bez. des Aufbaus und je ein Bild der Segue Einstellungen beigefügt.

    Irgendwie steht mir einer auf dem Schlauch. Kann mir jemand sagen, wo der Fehler liegt?

    Besten Dank und ein schönes Wochenende!

    mac
    Dateien
  • MyMattes schrieb:

    MCDan schrieb:

    In einen NavigationController kann man keinen weiteren NavigationController anzeigen.
    Aber nicht verwirren lassen: Der UISplitViewController macht genau das ... allerdings automatisch und man sollte da tunlichst nicht „reinpfuschen“ :D
    @Bertone105: Einfach nur die SplitViee ihre Magie machen lassen...

    Mattes
    Sind die beiden Navigation Controller (jeweils 2. von rechts) dann jetzt ok, oder nicht? ?(
  • MCDan schrieb:

    Sind die beiden Navigation Controller (jeweils 2. von rechts) dann jetzt ok, oder nicht? ?(
    Meines Erachtens sind die nicht okay: Die Master- und DetailView haben jeweils einen UINavigationController, welche (automatisch) ineinander geschachtelt sind. Innerhalb einer View pushe ich nur weitere ViewController, nicht erneute UINavigationController. Bei mir sieht das z. B. so aus (wobei ich keine Segue verwende):

    UISplitView.png

    @Bertone105: Ist ist sehr lehrreich, einmal einen Breakpoint nach Aufbereiten der Views zu setzen und sich dann die View-Hierarchien per "po" in der Debug-Konsole ausgeben zu lassen, insbesondere das viewControllers-Property vom UISplitViewController und vor allem einmal bei den unterschiedlichen Geräten und Orientierungen...

    Gruss, Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • So, nun komme ich endlich mal dazu mich euren Antworten zu widmen. Erst mal vielen Dank!

    Ein großes Problem habe ich bei der Standardvariante der SplitViews. Es wird beim Aufrufen nicht der Master, sondern der Detail View angezeigt. Ich will es aber genau so, wie die Einstellungen App in IOS.
    Also erst mal die Übersicht und dann geh ich in die Unterpunkte.

    Wie löse ich das? Gibt es da einen Trick dem System zu sagen, was er als Erstes nehmen soll oder müssen da einige Zeilen Code her?
  • Wenn Du in Deiner App keine State Restoration nutzt, wird eine UISplitView immer mit der MasterView starten ... es sei denn, Du hast führst selber in Deinem Code eine entsprechende Segue / ein Push aus...

    Deaktiviere einmal State Restoration über die entsprechende Methode des AppDelegates ... wobei dies eigentlich ein "Opt-in" ist und mich wundert, wenn es ohne Dein Wissen aktiviert ist...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Mal noch eine ergänzende Frage. Das Teil funktioniert ja auf dem IPad, aber nicht auf dem IPhone. Ich hab gelesen, daß die Settings App von IOS beim IPad ein SplitView und beim IPhone ein NavigationView ist.

    Ich könnte doch für meinen Bereich "Einstellungen" zwei neue Storyboards machen und dann mit einer Abfrage, ob IPhone oder IPad entsprechend verweisen. Das Eine wäre dann mit SplitView aufgebaut, das Andere mit NavigationView. Nur müsste ich dann den Inhalt immer doppelt programmieren?

    Wie würdet ihr das angehen, wenn ihr beides in einer App vereint oder ist das nonsens?

    Gruß mac
  • Bertone105 schrieb:

    Ich könnte doch für meinen Bereich "Einstellungen" zwei neue Storyboards machen und dann mit einer Abfrage, ob IPhone oder IPad entsprechend verweisen. Das Eine wäre dann mit SplitView aufgebaut, das Andere mit NavigationView. Nur müsste ich dann den Inhalt immer doppelt programmieren?
    Ich würde an Deiner Stelle einmal ein neues Test-Projekt starten, in dem ich einfach stumpf das Master-/View-Template von Apple kompiliere und auf den unterschiedlichen Device-Typen (z. B. im Simulator) anschauen:

    Dann wirst Du feststellen, dass der UISplitViewController genau das mit einem Storyboard und zwei ViewControllern (zzgl. NavigationController) macht: Auf dem iPhone (besser: bei einer komprimierten Darstellung) werden Master- und DetailView auf einen Navigation-Stack gepusht, in der erweiterten Darstellung (iPad) werden beide Views nebeneinander präsentiert ... wobei die DetailView auch bildschirmfüllend dargestellt werden kann. Genau die Ansichten, die Du aus der Settings-App, Mail etc. kennst.

    Hierzu auch die entsprechende Beschreibung von Apple (hast Du dort einmal nachgelesen?):

    Apple schrieb:

    The split view controller determines the arrangement of its child view controllers based on the available space. In a horizontally regular environment, the split view controller presents its view controllers side-by-side whenever possible. In a horizontally compact environment, the split view controller acts more like a navigation controller, displaying the primary view controller initially and pushing or popping the secondary view controller as needed. You can also ask the split view controller to prefer a specific arrangement by assigning a value to the preferredDisplayMode property.
    Es macht dabei Sinn, etwas mit den Darstellungs-Funktionen des UISplitViewControllers zu spielen, die z. B. kontrollieren, ob die MasterView über oder neben der DetailView eingeblendet wird.

    Wenn Du Deinen Ansatz selber programmieren willst, solltest Du auf die Spezialfälle achten: iPhone Plus Modelle nutzen im Querformat z. B. die gleichzeitige Darstellung mit einem DisplayMode-Button, um die DetailView bildschirmfüllend darzustellen. Auf dem iPad wiederum gibt es Split-View und Slide-Over, in denen die App in komprimierter Form dargestellt wird. Dies alles nachzubilden ist m. E. vergebliche Liebesmüh ... zumal Apple genau dafür den genannten Controller anbietet.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MyMattes () aus folgendem Grund: Apple Doku inkl. Link ergänzt.

  • Hallo zusammen,

    durch Zufall habe ich des Rätsels Lösung gefunden. Mein Aufbau war korrekt und funktioniert so wie er soll.

    Die Ursache der Fehlermeldung Split View Controllers cannot be pushed to a Navigation Controller war, daß meine Einstellungsseite im TabBarController unter "More" erschien, also mindestens bereits der 6. Tab war.

    Hierzu ein Kommentar eines Apple Mitarbeiters:

    Justin (Apple) schrieb:

    Even with the changes to UISplitViewController in iOS 8, pushing a split view controller onto a navigation stack remains unsupported. Consider reworking your design to avoid having tabs containing a split view controller appear in the More screen.
    Als ich also den betroffenen Icon in der TabBar auf mindestens die 4. Position gerückt hab, hat alles wieder funktioniert.

    Da musst auch erst mal drauf kommen.

    Trotzdem vielen Dank fürs Mitgrübeln!