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?

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)

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.


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)

15

Swift 3 und Swift 4

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

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)

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


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

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)

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)

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).


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
}

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.


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)
}
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.