Ich verwende folgenden Code, um programmgesteuert zu einem anderen ViewController zu navigieren. Es funktioniert gut, aber es verbirgt sich irgendwie navigation bar
. Wie behebe ich das? (Die Navigationsleiste wird durch Einbetten der ViewController
in die Liste erstellt, navigation controller
wenn dies wichtig ist.)
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("nextView") as NextViewController
self.presentViewController(nextViewController, animated:true, completion:nil)
quelle
storyBoard.instantiateViewController
undself.present
vom Haupt-Thread an, oder Sie werden eine Verzögerung beim Erscheinen von viewController-Komponenten habenSWIFT 4.x.
Die Strings in doppelten Anführungszeichen verwirren mich immer, daher denke ich, dass die Antwort auf diese Frage eine grafische Darstellung erfordert, um dies zu klären.
Für eine Banking-App habe ich einen LoginViewController und einen BalanceViewController. Jeder hat seine eigenen Bildschirme.
Die App startet und zeigt den Anmeldebildschirm an. Wenn die Anmeldung erfolgreich ist, öffnet die App den Bildschirm Balance.
So sieht es aus:
Der Anmeldeerfolg wird folgendermaßen behandelt:
let storyBoard: UIStoryboard = UIStoryboard(name: "Balance", bundle: nil) let balanceViewController = storyBoard.instantiateViewController(withIdentifier: "balance") as! BalanceViewController self.present(balanceViewController, animated: true, completion: nil)
Wie Sie sehen können, wird in der zweiten Zeile des Codes die Storyboard-ID "Balance" in kleinen Buchstaben angezeigt. Diese ID wird in den Storyboard-Einstellungen wie im angehängten Screenshot definiert.
Der Begriff "Balance" mit Großbuchstaben "B" ist der Name der Storyboard- Datei, die in der ersten Zeile des Codes verwendet wird.
Wir wissen, dass die Verwendung von hartcodierten Strings im Code eine sehr schlechte Praxis ist, aber irgendwie ist dies in der iOS-Entwicklung eine gängige Praxis geworden, und Xcode warnt nicht einmal davor.
quelle
Sie sollten den neuen Viewcontroller mithilfe des aktuellen Navigationscontrollers drücken, der nicht vorhanden ist.
self.navigationController.pushViewController(nextViewController, animated: true)
quelle
push
wünschen, müssen Sie den Viewcontroller mit Ihrem Navigationscontroller verbinden. (das wird von links nach rechts animiert) Wenn Sie nur das Popup auf dem aktuellen Bildschirm anzeigen, präsentieren und anzeigen möchten (das von unten nach oben animiert wird), verwenden Sie einfachpresent
.Laut @jaiswal Rajan in seiner Antwort . Sie können einen pushViewController wie folgt ausführen:
let storyBoard: UIStoryboard = UIStoryboard(name: "NewBotStoryboard", bundle: nil) let newViewController = storyBoard.instantiateViewController(withIdentifier: "NewViewController") as! NewViewController self.navigationController?.pushViewController(newViewController, animated: true)
quelle
Wenn Sie also einen Ansichts-Controller präsentieren, wird dieser im Navigations-Controller nicht angezeigt. Es wird nur ein vollständiger Bildschirm angezeigt. In diesem Fall müssen Sie einen weiteren Navigationscontroller erstellen und Ihren
nextViewController
Stamm als Root hinzufügen und diesen neuen Navigationscontroller präsentieren.Eine andere Möglichkeit besteht darin, einfach den View Controller zu drücken.
self.presentViewController(nextViewController, animated:true, completion:nil)
Weitere Informationen finden Sie in der Apple-Dokumentation: - https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/doc/uid/TP40006926-CH3-SW96
quelle
presentViewController
wurde umbenannt inpresent(loginController, animated:true, completion:nil)
OperationQueue.main.addOperation { let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let newViewController = storyBoard.instantiateViewController(withIdentifier: "Storyboard ID") as! NewViewController self.present(newViewController, animated: true, completion: nil) }
Es hat bei mir funktioniert, als ich den Code in das
OperationQueue.main.addOperation
eingefügt habe, der im Hauptthread für mich ausgeführt wird.quelle
Der obige Code funktioniert gut, aber wenn Sie von einer
NSObject
Klasse aus navigieren möchten, die Sie nicht verwenden könnenself.present
:let storyBoard = UIStoryboard(name:"Main", bundle: nil) if let conVC = storyBoard.instantiateViewController(withIdentifier: "SoundViewController") as? SoundViewController, let navController = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController { navController.pushViewController(conVC, animated: true) }
quelle
Alle anderen Antworten klingen gut. Ich möchte meinen Fall behandeln, in dem ich einen animierten LaunchScreen erstellen musste. Nach 3 bis 4 Sekunden Animation bestand die nächste Aufgabe darin, zum Startbildschirm zu wechseln. Ich habe Segues ausprobiert, aber das hat zu Problemen bei der Zielansicht geführt. Am Ende habe ich auf die Window-Eigenschaft von AppDelegates zugegriffen und ihm einen neuen NavigationController-Bildschirm zugewiesen.
let storyboard = UIStoryboard(name: "Main", bundle: nil) let appDelegate = UIApplication.shared.delegate as! AppDelegate let homeVC = storyboard.instantiateViewController(withIdentifier: "HomePageViewController") as! HomePageViewController //Below's navigationController is useful if u want NavigationController in the destination View let navigationController = UINavigationController(rootViewController: homeVC) appDelegate.window!.rootViewController = navigationController
Wenn Sie nicht möchten, dass der Navigationscontroller in der Zielansicht angezeigt wird, weisen Sie ihn einfach als zu.
let storyboard = UIStoryboard(name: "Main", bundle: nil) let appDelegate = UIApplication.shared.delegate as! AppDelegate let homeVC = storyboard.instantiateViewController(withIdentifier: "HomePageViewController") as! HomePageViewController appDelegate.window!.rootViewController = homeVC
quelle