webentwicklung-frage-antwort-db.com.de

Swift ios hat einen neuen Root-View-Controller eingerichtet

Ich frage mich, ob es möglich ist, einen neuen Root-VC festzulegen.

Meine App erhält init mit einem Uinavigation-Controller, der eine Tabellenansicht als Root-VC hat.

In der Tabellenansicht führe ich dann ein weiteres Fenster in ein Anmeldefenster (derzeit modal) aus. Wenn Sie sich dann anmelden, landen Sie auf der VC/Account-Seite red. Was ich jetzt tun möchte, ist, das rote VC als neues Stammverzeichnis VC der App festzulegen und alle darunter liegenden VCs zu entfernen. Damit kann ich eine Menütaste/ein Symbol anstelle einer Schaltfläche "Zurück" anzeigen

Ich habe das gefunden, aber ich verstehe nicht, wie man es benutzt:

let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
        let yourViewController: ViewController = storyboard.instantiateViewControllerWithIdentifier("respectiveIdentifier") as! ViewController

        let navigationController = self.window?.rootViewController as! UINavigationController
        navigationController.setViewControllers([yourViewController], animated: true)

Aber ich kann es nicht zum Laufen bringen. So ist es möglich, den roten VC im Bild als neuen Root-VC zu verwenden.

 enter image description here

15
user2722667

Vielleicht sollten Sie dies versuchen

 let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
 let redViewController = mainStoryBoard.instantiateViewControllerWithIdentifier("respectiveIdentifier") as! ViewController
 let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
 appDelegate.window?.rootViewController = redViewController
26
Vashum

Swift 3 Update: -

let testController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "testController") as! TestController
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = testController
20
footyapps27

UINavigationController verfügt über eine viewControllers -Eigenschaft, die ein NSArray ist. Sie können sie durch Ihr eigenes NSArray von View-Controllern ersetzen.

Dies kann wie im folgenden Beispielcode gezeigt durchgeführt werden.

let newViewController = self.storyboard?.instantiateViewControllerWithIdentifier("YourViewControllerollerID") as! YourViewController

    let customViewControllersArray : NSArray = [newViewController]
    self.navigationController?.viewControllers = customViewControllersArray as! [UIViewController]

Und wenn Sie diesen neuen Root-View-Controller anzeigen möchten, rufen Sie einfach die popToRootViewController () - Methode von UINavigationController auf.

self.navigationController?.popToRootViewControllerAnimated(true)
6
Tushar Korde

Um das Code-Snippet von der ursprünglichen Frage zum Laufen zu bringen, musste ich die dritte Zeile ändern

let navigationController = self.navigationController!

Ich verwende diesen Code in einer @IBAction im View-Controller, der dem neuen Root-View-Controller vorangeht.

Bei Verwendung des ursprünglichen Codes erhielt ich eine Fehlermeldung, dass mein Ansichtscontroller kein Mitglied mit dem Namen window hatte. Nachdem ich die documentation angesehen hatte, konnte ich keine Eigenschaft mit dem Namen window finden. Ich frage mich, ob der ursprüngliche Code-Block in einer UINavigationController-Datei verwendet werden sollte.

Hier ist der Block in seiner Gesamtheit.

let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
let todayViewController: TodaysFrequencyViewController = storyboard.instantiateViewControllerWithIdentifier("todaysFrequency") as! TodaysFrequencyViewController    
let navigationController = self.navigationController!
navigationController.setViewControllers([todayViewControl ler], animated: true)
5
Amelia

Schnelle 4 Antwort 

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "YourViewController") as! YourViewController
let navigationController = UINavigationController(rootViewController: nextViewController)            
let appdelegate = UIApplication.shared.delegate as! AppDelegate
appdelegate.window!.rootViewController = navigationController
4
Akila Wasala

Sie können diesen Code verwenden:

let newViewController = self.storyboard?.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController

let customViewControllersArray : NSArray = [newViewController]
self.navigationController?.viewControllers = customViewControllersArray as! [UIViewController]
self.navigationController?.pushViewController(newViewController, animated: true)
2
Deepti Raghav

Ich frage mich, ob es möglich ist, einen neuen Root-VC festzulegen.

Ja, ist möglich. Wie du das machst, hängt vom Kontext ab ...

Meine App erhält init mit einem Uinavigation-Controller, der eine Tabellenansicht als Root-VC hat.

Es gibt zwei Dinge, die üblicherweise als "Root View Controller" bezeichnet werden: 

  • UIWindow hat eine rootViewController-Eigenschaft, die schreibbar ist.

  • UINavigationController hat keine rootViewController-Eigenschaft, jedoch einen Initialisierer namens -initWithRootViewController:. Sie können den "root" View Controller des Nav-Controllers festlegen, indem Sie dessen viewControllers -Eigenschaft festlegen.

Es klingt, als würden Sie versuchen, den Root-View-Controller des Fensters zu ändern, aber der von Ihnen gezeigte Code ändert nur die viewControllers-Eigenschaft des Nav-Controllers. Versuchen Sie, die rootViewController -Eigenschaft des Fensters direkt einzustellen. Verstehen Sie jedoch, dass der Navigationscontroller auch wegfällt, wenn Sie diesen Ansatz wählen. Wenn Sie den Nav-Controller dagegen behalten möchten, fahren Sie mit Ihrem aktuellen Ansatz fort.

Aber ich kann es nicht zum Laufen bringen. So ist es möglich, den roten VC im Bild als neuen Root-VC zu verwenden.

Weitere Informationen hier wären hilfreich. Was meinst du mit "kann es nicht zum Laufen bringen"? Was passiert und was erwarten Sie?

2
Caleb

Sie können diesen Code verwenden, wenn Sie auf die Login-Schaltfläche klicken: -

let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var vc = mainStoryboard.instantiateViewControllerWithIdentifier("respectiveIdentifier") as ViewController  
UIApplication.sharedApplication().keyWindow.rootViewController = vc
1

Wie und woher präsentieren Sie redVC?

Sie könnten ihn zu einem Root-View-Controller Ihres UINavigationControllers machen, so dass Sie weiterhin die Möglichkeit haben, View-Controller per Push und Pop zu öffnen.

self.navigationController?.viewControllers = [self];
1
ArturOlszak

Schnell 4

 let storyBoard = UIStoryboard(name: "Your_Storyboard_Name", bundle:Bundle.main)
 self.window = UIWindow(frame: UIScreen.main.bounds)
 let yourVc = storyBoard.instantiateViewController(withIdentifier: "YourIdentifier") as? YourViewController
 if let window = window {
  window.rootViewController = yourVc
   }
 self.window?.makeKeyAndVisible()
0
Sandeep Kakde

Für Swift 4.0 .

Fügen Sie in Ihre AppDelegate.Swift -Datei in didfinishedlaunchingWithOptions den folgenden Code ein.

var window: UIWindow?


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    window = UIWindow(frame: UIScreen.main.bounds)
    window?.makeKeyAndVisible()

    let rootVC = MainViewController() // your custom viewController. You can instantiate using nib too. UIViewController(nib name, bundle)

    let navController = UINavigationController(rootViewController: rootVC) // Integrate navigation controller programmatically if you want
    window?.rootViewController = navController

    return true
}

Ich hoffe, es wird gut funktionieren.

0
mumu

Wenn Sie rootViewController mit einigen Animationen einstellen müssen, hier der Code:

guard let window = UIApplication.shared.keyWindow else {
    return
}

guard let rootViewController = window.rootViewController else {
    return
}

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "MainTabbar")
vc.view.frame = rootViewController.view.frame
vc.view.layoutIfNeeded()

UIView.transition(with: window, duration: 0.3, options: .transitionCrossDissolve, animations: {
    window.rootViewController = vc
}, completion: { completed in
    // maybe do something here
})
0
Amrit Sidhu

Link zu einer verwandten Frage

Diese Antwort gilt für die Verwendung eines vorhandenen ViewControllers von einem beliebigen Ort im aktuellen Stapel, ohne einen neuen Controller zu instanziieren und neu zu konfigurieren.

Die Dokumentation sagt: Der Root View Controller stellt die Inhaltsansicht des Fensters bereit. Wenn Sie dieser Eigenschaft einen View Controller (entweder programmgesteuert oder mithilfe von Interface Builder) zuweisen, wird die View Controller-Ansicht als Inhaltsansicht des Fensters installiert. Die neue Inhaltsansicht ist so konfiguriert, dass sie die Fenstergröße verfolgt und sich bei Änderung der Fenstergröße ändert. Wenn das Fenster über eine vorhandene Ansichtshierarchie verfügt, werden die alten Ansichten entfernt, bevor die neuen Ansichten installiert werden.

Genau wie in der Dokumentation heißt: Es entfernt alle Ansichten im Stack, wenn der rootViewController ausgetauscht wird. Egal was mit dem Controller ist. Entfernen Sie daher den ViewController aus dem Stapel, um sicherzustellen, dass seine Ansicht nicht entfernt wird. 

Dies ergab in meinem Fall folgende Lösung:

    if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
        guard let pageVC = self.onboardingDelegate as? OnboardingPageViewController else { return } // my current stack is in a pageViewController, it also is my delegate
        let vc = self // holding myself
        pageVC.subViewControllers.removeLast() // removing myself from the list
        pageVC.setViewControllers([pageVC.subViewControllers[0]], direction: .forward, animated: false, completion: nil) // remove the current presented VC
        appDelegate.window?.rootViewController = vc
        vc.onboardingDelegate = nil
        appDelegate.window?.makeKeyAndVisible()
    }
0
Viktor_DE

Sie können diesen Code ausprobieren

func switchRootViewController(rootViewController: UIViewController, animated: Bool, completion: (() -> Void)?) {
    guard let window = UIApplication.shared.keyWindow else { return }
    if animated {
        UIView.transition(with: window, duration: 0.5, options: .transitionCrossDissolve, animations: {
            let oldState: Bool = UIView.areAnimationsEnabled
            UIView.setAnimationsEnabled(false)
            window.rootViewController = rootViewController
            UIView.setAnimationsEnabled(oldState)
        }, completion: { (finished: Bool) -> () in
            if (completion != nil) {
                completion!()
            }
        })
    } else {
        window.rootViewController = rootViewController
    }
}
0
Anirudha Mahale

sobald Sie sich in der VC befinden, die Sie als Root festlegen möchten, fügen Sie einfach viewDidLoad hinzu:

let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = self

* Gemäß best practice sollten Sie prüfen, ob es sich bereits um das Stammverzeichnis handelt, wenn Sie den obigen Code nicht ausführen.

0
MLBDG

Swift 3 AppDelegate-Datei :::

@IBAction func btnGoBack(_ sender: UIButton){

   self.goToHomeVC()
}

func goToHomeVC(){

    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    let viewController = storyboard.instantiateViewController(withIdentifier :"HomeVC") as! HomeVC

    let navController = UINavigationController.init(rootViewController: viewController)

    if let window = self.appDelegate.window, let rootViewController = window.rootViewController {

        var currentController = rootViewController

        while let presentedController = currentController.presentedViewController {

            currentController = presentedController
        }

        currentController.present(navController, animated: true, completion: nil)
    }
}
0
Deepak Tagadiya