2015-06-20 35 views
18

Przebudowuję aplikację bez scenorysów, a jej część, z którą mam najwięcej problemów, polega na programowym przeglądaniu widoku do wyświetlenia. Niewiele jest napisanych rzeczy, które nie używają scenorysów, więc znalezienie odpowiedzi na to było trudne.Swift - Tworzenie kontrolera nawigacji bez scenorysów w Delegacie aplikacji

Mój problem jest dość prosty. Mam swój ViewController i mój SecondViewController i chcę przejść od pierwszego do drugiego.

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

Następnie w 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) 
    } 
} 

Druk self.navigationController zwraca zero. Próbowałem robić:

var navController = UINavigationController() gdy klasa ViewController jest tworzony (ale poza viewDidLoad, tuż pod deklaracji klasy) i zrobione push pomocą navController var ale to nie działało.

Myślę, że może rozwiązaniem będzie stworzenie kontrolera nawigacyjnego w Delegacie aplikacji, który będzie używany przez całą aplikację, jak sądzę jako zmienna globalna?

Mam nadzieję, że ten post może służyć wielu innym, którzy są nowicjuszami w Swift i chcą usunąć storyboardy ze swojej aplikacji.

Dzięki za spojrzenie i za pomoc.

Odpowiedz

20

Swift 3

Umieść ten kod wewnątrz metody didFinishLaunchingWithOptions w klasie 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

Co to jest niestandardowy kontroler nawigacji? – user7097242

16

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

W 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

Dlaczego ustawiasz viewcontroller na uiviewcontroller zamiast mojego pierwszego kontrolera widoku, ViewController.swift? –

+0

@ZackShapiro, Edytowałem swoją odpowiedź. Stworzyłem przykład w Xcode z tym kodem i działa. – agy

+0

Dzięki człowieku, spróbuję, gdy wrócę do mojej maszyny. –