Schneller presentViewController

73

Ich habe programmgesteuert mehrere View Controller in einem iOS Swift-Projekt. Ich habe die Storyboards nicht und möchte sie nach Möglichkeit vermeiden. Gibt es eine Möglichkeit, zu einer anderen viewcontroller.swiftDatei zu wechseln (wir werden sie aufrufen view2.swift) und sie Teil einer Funktion zu sein, die eine Schaltfläche aufruft?
Ich habe folgendes versucht:

let storyboard: UIStoryboard = UIStoryboard(name: "myTabBarName", bundle: nil)
let vc: UIViewController = storyboard.instantiateViewControllerWithIdentifier("myVCID") as UIViewController
self.presentViewController(vc, animated: true, completion: nil)

Das obige funktioniert mit Storyboards, aber ich möchte, dass ein anderes view2.swiftaufgerufen wird. Kann das gemacht werden?

Z-Tech
quelle

Antworten:

119

Versuche dies:

let vc = ViewController() //change this to your class name
self.presentViewController(vc, animated: true, completion: nil)

Mit Swift3:

self.present(vc, animated: true, completion: nil)
Adam
quelle
3
Ich würde empfehlen, den Initialisierer zu verwenden:ViewController(nibNameOrNil: nil, bundleOrNil: nil)
Simon Germain
23
@Adam, ich mache genau das Gleiche, um die Ansicht auf einem Knopfdruck anzuzeigen. Es wird ein schwarzer leerer Bildschirm angezeigt. Es gibt keine Fehler. Irgendeine Idee, warum ich einen schwarzen Bildschirm bekomme?
Sanjivani
2
@Sanjivani, Ab iOS7 ist die Standardfarbe der Ansicht klare Farbe. Es wird also ein schwarzer Bildschirm angezeigt. Legen Sie die Farbe in VIewControllers viewDidLoad als Überschreibungsfunktion fest. ViewDidLoad () {super.viewDidLoad () self.view.backgroundColor = UIColor.greenColor ()}
Shanmugaraja G
4
Dies wird leeren Bildschirm auftreten!
Mojtabye
1
Wie dies akzeptiert und so oft abgestimmt wird, dass es nicht einmal den Initialisierer für den Viewcontroller verwendet, wird dies zu nichts führen
Tj3n
103

Für diejenigen, die leere / schwarze Bildschirme bekommen, hat dieser Code für mich funktioniert.

    let vc = self.storyboard?.instantiateViewController(withIdentifier: myVCID) as! myVCName
    self.present(vc, animated: true, completion: nil)

Um die "Kennung" für Ihre VC festzulegen, rufen Sie einfach den Identitätsinspektor für die VC im Storyboard auf. Stellen Sie die 'Storyboard-ID' auf die gewünschte ID ein. Schauen Sie sich das Bild unten als Referenz an.

Boidkan
quelle
5
@KD. außer dass die Frage gestellt wurde, es ohne Storyboards zu tun.
Suragch
20

Als Referenz, da diese Frage eines der ersten Google-Ergebnisse ist.

Breaking Change in Swift 3:

Die Methode presentViewControllerwird durch die Methode ersetzt present.

Sie können es wie das alte verwenden:

self.present(viewControllerToPresent, animated: true, completion: nil)

Beispiel zum Öffnen der Kamera:

let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = UIImagePickerControllerSourceType.camera
imagePicker.allowsEditing = false
self.present(imagePicker, animated: true, completion: nil)
Arnlen
quelle
15

Swift 3 und Swift 4

let vc = self.storyboard?.instantiateViewController(withIdentifier: "idMyViewControllerName") as! MyViewControllerName
self.present(vc, animated: true, completion: nil)
Kaptain
quelle
8

Für mich hatte ich zwei Ansichten in zwei separaten Navigationssteuerungen. Ich musste eine Kombination der oben genannten verwenden.

var vc = self.storyboard?.instantiateViewControllerWithIdentifier("WelcomeViewController") as! WelcomeViewController
    var navigationController = UINavigationController(rootViewController: vc)
    self.presentViewController(navigationController, animated: true, completion: nil)

Swift 3.x.

        let secondVC = self.storyboard?.instantiateViewController(withIdentifier: "VC-ID" as! yourViewController
        let navigationVC = UINavigationController(rootViewController: secondVC)
        self.present(navigationVC, animated: true, completion: nil)
Keith Holliday
quelle
6

Verwenden von Swift 2.1+

 let vc = self.storyboard?.instantiateViewControllerWithIdentifier("settingsVC") as! SettingsViewController
 self.presentViewController(vc, animated: true, completion: nil)

Geben Sie hier die Bildbeschreibung ein

ColossalChris
quelle
4

Der schwarze Bildschirm wurde behoben, indem ein Navigationscontroller hinzugefügt und der zweite Ansichtscontroller als rootVC festgelegt wurde.

let vc = ViewController()       
var navigationController = UINavigationController(rootViewController: vc)
self.presentViewController(navigationController, animated: true, completion: nil
AMG
quelle
4

Verwenden Sie einfach Folgendes: Stellen Sie sicher, dass Sie nibName verwenden, da sonst vorinstallierte Ansichten von xib nicht angezeigt werden:

var vc : ViewController = ViewController(nibName: "ViewController", bundle: nil) // ändere dies in deinen Klassennamen

 self.presentViewController(vc, animated: true, completion: nil)
Alok
quelle
0

Sie können den folgenden Code verwenden:

var vc = self.storyboard?.instantiateViewControllerWithIdentifier("YourViewController") as! YourViewController;
            vc.mode_Player = 1
            self.presentViewController(vc, animated: true, completion: nil)
Lê Trường Giang
quelle
0

Eine andere Möglichkeit ist, dass Sie das XIB nicht in Ihrem Build-Ziel haben (was mir passiert ist).

Dies kann passieren, wenn Sie ein anderes Ziel für Dev-, Test- und Release-Builds haben (das Sie sowieso haben sollten).

Ger
quelle
0

Sie können Code verwenden:

if let vc = self.storyboard?.instantiateViewController(withIdentifier: "secondViewController") as? secondViewController {
   let appDelegate = UIApplication.shared.delegate as! AppDelegate
   appDelegate.window?.rootViewController = vc
}
tvtruong
quelle
0

Sie müssen den ViewController nicht im Storyboard instanziieren, damit present()ViewController funktioniert. Das ist eine hackige Lösung.

Wenn Sie einen sehen schwarz / leeren Bildschirm , wenn ein VC präsentiert, könnte es sein , weil Sie anrufen present()aus viewDidLoad()im Ersten / RootViewController, aber der erste Blick ist noch nicht fertig.

Rufen Sie present()von viewDidAppearan, um dies zu beheben, dh:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    let yourVC = YourViewController()
    self.present(yourVC, animated: true, completion: nil)
}

Sobald eine "Ansicht" in Ihrer App angezeigt wurde, können Sie present () von aufrufen viewDidLoad().


Die Verwendung UINavigationController(wie in einer Antwort vorgeschlagen) ist eine weitere Option, es kann jedoch ein Overkill sein, um dieses Problem zu lösen. Sie könnten den Benutzerfluss komplizieren. Verwenden Sie die UINavigationControllerbasierte Lösung nur, wenn Sie eine NavigatonBar haben oder zum vorherigen Ansichts-Controller zurückkehren möchten.

Nitin Nain
quelle
0

Ich hatte ein ähnliches Problem, aber in meinem Fall bestand die Lösung darin, die Aktion als asynchrone Aufgabe in der Hauptwarteschlange auszulösen

DispatchQueue.main.async {
    let vc = self.storyboard?.instantiateViewController(withIdentifier: myVCID) as! myVCName
    self.present(vc, animated: true, completion: nil)
}
de Isaac
quelle