2015-06-20 11 views
18

Sto ricostruendo un'app senza storyboard e la parte di esso con cui ho più problemi è la navigazione in modalità view-to-view. Poche cose sono scritte là fuori che non usano gli storyboard, quindi trovare una risposta per questo è stato difficile.Swift - Creazione di un'istanza di un controller di navigazione senza storyboard nel Delegato app

Il mio problema è piuttosto semplice. Ho il mio ViewController e il mio SecondViewController e voglio spingere dal primo al secondo.

In 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 
} 

Poi nel 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) 
    } 
} 

stampa self.navigationController rendimenti zero. Ho provato a fare:

var navController = UINavigationController() quando viene creata la classe ViewController (ma al di fuori di viewDidLoad, proprio sotto la dichiarazione della classe) e fatto la spinta utilizzando il navController var, ma che non ha funzionato.

Sto pensando che forse la soluzione è creare un controller di navigazione nel Delegato app che l'intera app userebbe, credo come variabile globale?

La mia speranza è che questo post possa servire molti altri che sono nuovi a Swift e vogliono rimuovere gli storyboard dalla loro app.

Grazie per dare un'occhiata e per il vostro aiuto.

risposta

20

In Swift 3

Inserire questo codice all'interno del metodo didFinishLaunchingWithOptions nella classe 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() 
+0

Qual è il tuo dispositivo di navigazione personalizzato? – user7097242

16

In 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 
} 

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


} 
+0

Perché si imposta viewcontroller a un controllore uiview anziché al mio primo controller di visualizzazione, ViewController.swift? –

+0

@ZackShapiro, ho modificato la mia risposta. Ho creato un esempio in Xcode con questo codice e funziona. – agy

+0

Grazie amico, ci provo quando torno alla mia macchina –

Problemi correlati