Navigieren Sie programmgesteuert schnell zu einem anderen Ansichtscontroller / einer anderen Ansichtsszene


81

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 ViewControllerin die Liste erstellt, navigation controllerwenn 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)

Antworten:


200

Swift 5

Der standardmäßige modale Präsentationsstil ist eine Karte. Dies zeigt den vorherigen Ansichts-Controller oben und ermöglicht dem Benutzer, den dargestellten Ansichts-Controller wegzuwischen.

Um den alten Stil beizubehalten, müssen Sie den Ansichts-Controller, den Sie präsentieren, wie folgt ändern:

newViewController.modalPresentationStyle = .fullScreen

Dies gilt sowohl für programmgesteuert als auch für Storyboard-Controller.

Swift 3

Mit einem programmgesteuert erstellten Controller

Wenn Sie zu einem programmgesteuert erstellten Controller navigieren möchten, gehen Sie folgendermaßen vor:

let newViewController = NewViewController()
self.navigationController?.pushViewController(newViewController, animated: true)

Mit einem StoryBoard erstellten Controller

Wenn Sie mit dem Bezeichner "newViewController" zu Controller auf StoryBoard navigieren möchten, gehen Sie folgendermaßen vor:

let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "newViewController") as! NewViewController
        self.present(newViewController, animated: true, completion: nil)

2
"as! NewViewController" wird in der Storyboard-Option nicht benötigt
Lavi Avigdor

2
Ja, ich weiß, dass dies optional ist, aber wenn wir zeigen, wird klar, welcher Viewcontroller das Ziel eines anderen Entwicklers ist
Jaiswal Rajan,

4
Rufen Sie storyBoard.instantiateViewControllerund self.presentvom Haupt-Thread an, oder Sie werden eine Verzögerung beim Erscheinen von viewController-Komponenten haben
Alex

2
@Alex Look, es liegt an den Entwicklern, es vom Haupt-Thread aus aufzurufen. Ich habe gerade die Antwort auf die oben gestellte Frage geschrieben. Ihr Kommentar zum Aufrufen vom Haupt-Thread ist hier nicht angemessen.
Jaiswal Rajan

Hallo Leute: Darf ich in der Regel einen freundlicheren Ton vorschlagen? (Dies ist hier auf SO ein ziemliches Problem.) Zum Thema: Obwohl es nicht direkt von OP gefragt wird, denke ich, dass diese gute Antwort immer noch ein geeigneter Ort ist, um sich (für jeden, der liest) daran zu erinnern, dass Maßnahmen im Haupt-Thread stattfinden müssen
Superjos

32

SWIFT 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:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

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.


tolle Demonstrationen
Elias Fazel

1
Alter, du bist großartig!
OhhhThatVarun

15

Sie sollten den neuen Viewcontroller mithilfe des aktuellen Navigationscontrollers drücken, der nicht vorhanden ist.

self.navigationController.pushViewController(nextViewController, animated: true)

Warum sollten wir pushen, gibt es einen Nutzen?
DragonFire

1
@DragonFire, weil op möchte, dass es funktioniert, ohne die Navigationsleiste abzudecken. Wenn Sie ein Master-Detail-Seitendesign wie zwischen dem WhatsApp-Kontaktbildschirm und dem Chat-Bildschirm pushwü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 einfach present.
Okan Kocyigit

12

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)

1
Hallo, ich frage mich nur: Warum die bereits gepostete Antwort wiederholen? Vielleicht wäre auch ein Kommentar oder eine Gegenstimme in Ordnung gewesen. Oder gibt es weitere Gründe dahinter?
Superjos

Er präsentiert, um mit NavigationController zu navigieren. Vielen Dank.
Hiran DA Walawage

4

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 nextViewControllerStamm 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


presentViewControllerwurde umbenannt in present(loginController, animated:true, completion:nil)
kite_n_code

2
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.addOperationeingefügt habe, der im Hauptthread für mich ausgeführt wird.


1

Der obige Code funktioniert gut, aber wenn Sie von einer NSObjectKlasse aus navigieren möchten, die Sie nicht verwenden können self.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)
}

0

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.