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.swift
Datei 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.swift
aufgerufen wird. Kann das gemacht werden?
ViewController(nibNameOrNil: nil, bundleOrNil: nil)
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.
quelle
Als Referenz, da diese Frage eines der ersten Google-Ergebnisse ist.
Breaking Change in Swift 3:
Die Methode
presentViewController
wird durch die Methode ersetztpresent
.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)
quelle
Swift 3 und Swift 4
let vc = self.storyboard?.instantiateViewController(withIdentifier: "idMyViewControllerName") as! MyViewControllerName self.present(vc, animated: true, completion: nil)
quelle
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)
quelle
Verwenden von Swift 2.1+
let vc = self.storyboard?.instantiateViewControllerWithIdentifier("settingsVC") as! SettingsViewController self.presentViewController(vc, animated: true, completion: nil)
quelle
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
quelle
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 Klassennamenself.presentViewController(vc, animated: true, completion: nil)
quelle
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)
quelle
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).
quelle
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 }
quelle
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()
ausviewDidLoad()
im Ersten / RootViewController, aber der erste Blick ist noch nicht fertig.Rufen Sie
present()
vonviewDidAppear
an, 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 dieUINavigationController
basierte Lösung nur, wenn Sie eine NavigatonBar haben oder zum vorherigen Ansichts-Controller zurückkehren möchten.quelle
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) }
quelle