web-dev-qa-db-ja.com

Swift – App DelegateでストーリーボードなしでNavigation Controllerをインスタンス化する

ストーリーボードを使用せずにアプリを再構築していますが、最も苦労しているのは、プログラムを使用してビュー間を移動することです。ストーリーボードを使用しないものはそこにほとんど書かれていないため、これに対する答えを見つけるのは困難でした。

私の問題は非常に単純です。 ViewControllerSecondViewControllerがあり、前者から後者にプッシュしたい。

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

その後、_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)
    }
}
_

_self.navigationController_を印刷すると、nilが返されます。私はやってみました:

var navController = UINavigationController()ViewControllerクラスが作成され(ただしViewDidLoadの外部、クラス宣言のすぐ下)、navController varを使用してプッシュを実行したが、機能しなかった場合。

多分解決策は、アプリ全体で使用するナビゲーションコントローラーをApp Delegateに作成することだと思います、グローバル変数としてですか?

私の希望は、この投稿がSwiftに不慣れで、アプリからストーリーボードを削除したい多くの人に役立つことです。

ご覧いただきありがとうございます。

25
Zack Shapiro

In Swift

このコードをAppDelegateクラスのdidFinishLaunchingWithOptionsメソッド内に配置します。

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()
36
jaiswal Rajan

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
}

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


}
18
agy