Present View Controller Über aktuelles TabBarController mit NavigationController

Wenn ich VC präsentiere oder entlasse, möchte ich tabBar nicht mehr ein- und ausblenden, da dies zu einer schlechten Benutzererfahrung führt. Stattdessen möchte ich die nächste VC direkt über der Registerkartenleiste anzeigen, sodass ich, wenn ich die nächste VC durch langsames Ziehen von links nach rechts schließe, die hinter der Ansicht ausgeblendete tabBar sehen kann (siehe Abbildung unten).

Hinweis, meiner App sind zwei Registerkarten mit zwei VCs (VCA, VCB) zugeordnet. Beide VC haben auch eine eingebettete Navigationsleiste. VCA wechselt zu VCA1 und VCB wechselt zu VCB1. Im Moment rufe ich in VCA und VCB die folgende Funktion auf, um mit dem Ausblenden und Einblenden zu beginnen, wenn viewWillappear ausgeführt wird (Code unten).

self.navigationController?.showViewController(vc, sender: self)

  // Inside ViewWillAppear Only reappear the tab bar if we successfully enter Discover VC (To prevent drag back half way causing tab bar to cause comment entry to be floating). This code check if we have successfully enters DiscoverVC
    if let tc = transitionCoordinator() {
        if tc.initiallyInteractive() == true {
            tc.notifyWhenInteractionEndsUsingBlock({(context: UIViewControllerTransitionCoordinatorContext) -> Void in
                if context.isCancelled() {
                    // do nothing!
                }
                else {
                    // not cancelled, do it
                    self.tabbarController.tabBar.hidden = false
                }
            })
        } else {
            // not interactive, do it
            self.tabbarController.tabBar.hidden = false
        }
    } else {
        // not interactive, do it
        self.tabbarController.tabBar.hidden = false
    }

---------- Arbeitslösung von GOKUL -----------

Gokul's Antwort ist nah dran. Ich habe mit seiner Lösung gespielt und mir die folgende Verbesserung ausgedacht, um die Notwendigkeit einer redundanten VC zu beseitigen und auch die anfängliche VC zu beseitigen, die für eine kurze Sekunde angezeigt wird, bevor tabVC erscheint. Aber ohne Gokul würde ich mir das nie einfallen lassen !!

Zusätzlich würde Gokuls Methode einen Fehler für mich verursachen, da ich zwar eine anfängliche "normale" VC als LoginVC habe, bevor tabVC angezeigt wird. Diese Login-VC ist NUR die Root-VC, wenn der Benutzer sich anmelden muss. Wenn Sie also in den meisten Fällen rootVC auf tabVC setzen, wird navVC niemals registriert.

Die Lösung besteht darin, den Navigationscontroller und den TabBar-Controller in eine virtuelle Steuerung einzubetten. Es funktioniert aber NUR, wenn die navVC vor der TabBarVC steht. Ich bin mir nicht sicher, warum, aber die einzige Möglichkeit, mit der ich navVC-> tabVC-> VC1 / VC2 verwenden konnte, besteht darin, VC1 zuerst mit einer navVC einzubetten, und dann erneut auf VC1 zu klicken, um tabVC einzubetten tabVC und ich mussten auch nach dem Einbetten der NavVC erneut auf die VC1 klicken.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage