ios - change - set root view controller programmatically swift
Swift: creación de una instancia de un controlador de navegación sin guiones gráficos en App Delegate (2)
Estoy reconstruyendo una aplicación sin guiones gráficos y la parte de la que más problemas tengo es la navegación programática de vista a vista. Pocas cosas están escritas por ahí que no usan guiones gráficos, por lo que encontrar una respuesta para esto ha sido difícil.
Mi problema es bastante simple. Tengo mi ViewController
y mi SecondViewController
y quiero pasar del primero al segundo.
En AppDelegate
:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow(frame: UIScreen.mainScreen().bounds)
window?.backgroundColor = UIColor.whiteColor()
window?.rootViewController = ViewController()
window?.makeKeyAndVisible()
return true
}
Luego en ViewController.swift
:
class ViewController: UIViewController, AVAudioPlayerDelegate, UITextFieldDelegate {
override func viewDidLoad() {
super.viewDidLoad()
startFinishButton.setTitle("Begin", forState: .Normal)
startFinishButton.addTarget(self, action: "moveToSecondViewController", forControlEvents: .TouchUpInside)
view.addSubview <*> startFinishButton
}
func moveToSecondViewController(sender: UIButton) {
let vc = SecondViewController()
println(self.navigationController) // returns nil
self.navigationController?.pushViewController(vc, animated: true)
}
}
Imprimiendo self.navigationController
devuelve nil. He intentado hacer:
var navController = UINavigationController()
cuando se crea la clase ViewController
(pero fuera de ViewDidLoad, justo debajo de la declaración de clase) y se realiza el empuje usando la var navController
pero eso no ha funcionado.
Estoy pensando que tal vez la solución sea crear un controlador de navegación en App Delegate que toda la aplicación usaría, supongo como una variable global.
Mi esperanza es que esta publicación pueda servir a muchos otros que son nuevos en Swift y desean eliminar los guiones gráficos de su aplicación.
Gracias por echar un vistazo y por tu ayuda.
En AppDelegate
var window: UIWindow?
var navController: UINavigationController?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
navController = UINavigationController()
var viewController: ViewController = ViewController()
self.navController!.pushViewController(viewController, animated: false)
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
self.window!.rootViewController = navController
self.window!.backgroundColor = UIColor.whiteColor()
self.window!.makeKeyAndVisible()
return true
}
En ViewController
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.title = "FirstVC"
var startFinishButton = UIButton.buttonWithType(UIButtonType.System) as! UIButton
startFinishButton.frame = CGRectMake(100, 100, 100, 50)
startFinishButton.backgroundColor = UIColor.greenColor()
startFinishButton.setTitle("Test Button", forState: UIControlState.Normal)
startFinishButton.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside)
self.view.addSubview(startFinishButton)
}
func buttonAction(sender:UIButton!)
{
println("Button tapped")
let vc = SecondViewController()
self.navigationController?.pushViewController(vc, animated: true)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
En swift 3
Coloque este código dentro del método didFinishLaunchingWithOptions en la clase AppDelegate.
window = UIWindow(frame: UIScreen.main.bounds)
let mainController = MainViewController() as UIViewController
let navigationController = UINavigationController(rootViewController: mainController)
navigationController.navigationBar.isTranslucent = false
self.window?.rootViewController = navigationController
self.window?.makeKeyAndVisible()