open change ios objective-c swift uinavigationcontroller appdelegate

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