1. 程式人生 > >iOS開發(Swift):建立UINavigationView的三種方法

iOS開發(Swift):建立UINavigationView的三種方法

UINavigationController是iOS開發中很常用的一種元件,由於種種原因許多人喜歡從程式碼建立檢視控制元件,包括UINavigationController,但是有時候我們的螢幕控制元件太多,一方面使用storyboard可以方便設計,但是另一方面又需要用程式碼建立UINavigationController來靈活控制程式執行,下面將分別介紹程式碼,IB和兩者結合建立一個UINavigationController的方法:

1.程式碼建立UINavigationController

新建一個SingleView專案,將AppDelegate.swift檔案中application:didFinishLaunchingWithOptions:方法修改如下,注意原來的window為optional型別,為了方便可以改為var window: UIWindow!,表示window值我們會賦值。然後建立一個根檢視控制器rootViewController,一個導航控制器navigationController。

    var window: UIWindow!
    var rootViewController: UIViewController!
    var navigationController: UINavigationController!


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        
        window = UIWindow(frame: UIScreen().bounds)
        window.makeKeyAndVisible()
        
        rootViewController = UIViewController()
        navigationController = UINavigationController(rootViewController: rootViewController)
        
        window.rootViewController = rootViewController
        window.addSubview(navigationController.view)
        
        return true
    }
application:didFinishLaunchingWithOptions:函式中初始化以上三個變數,將window設定為活動視窗並可見,使用rootViewController建立navigationController,把navigationController的檢視新增到window中。

到此,執行程式可見到如下介面。見到如圖上部分的導航條即表示成功建立NavigationController。

由於該rootViewController通過rootViewController = UIViewController()初始化,所以該介面一片漆黑,接下來我們把初始化rootViewController的語句改改。

在新建專案時,Xcode生成了一個ViewController類,我們可以使用該類來初始化,把上面rootViewController = UIViewController()改成rootViewController = ViewController(),然後到ViewController類中,將viewDidLoad函式修改如下:

    override func viewDidLoad() {
        super.viewDidLoad()

        self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "下一個", style: UIBarButtonItemStyle.Plain, target: self, action: "next:")
    }
並新增一個函式如下

    func next(sender: AnyObject) {
        println("跳轉")
    }
再次執行程式,應該可以看到控制檯列印 跳轉 兩個字,能夠執行next函式,意味著可以進行檢視跳轉。 下次我們將為NavigationController新增更多內容,讓他們能在不同檢視跳轉 ,但是現在我們繼續看看另一種建立NavigationController的方法。

2.IB建立UINavigationController

IB建立UINavigationController確實也是很方便,新建一個SingleView App,開啟Main.storyboard,點選選單Editor->Embed In->Navigation Controller,即可完成,介面如下

這樣,一個NavigationController就建立好了,那麼要實現跳轉,首先當然要有按鈕,到Object庫中拖一個Bar Button Item到上圖右側的導航欄處



到此通過IB建立NavigationController也實現了。接下來就是兩者結合的時候了。

3.通過程式碼連線Storyboard建立NavigationController。

首先建立一個SingleView App,開啟storyboard,隨便設計佈局,接下來我們將連線該storyboard。

由於程式碼中需要引用,因此同樣到AppDelegate中新增以下三個變數

    var window: UIWindow!
    var rootViewController: UIViewController!
    var navigationController: UINavigationController!

但是在application:didFinishLaunchingWithOptions函式中我們將使用storyboard來建立rootViewController,修改application:didFinishLaunchingWithOptions函式如下:

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
        window = UIWindow(frame: UIScreen.mainScreen().bounds)
        window.makeKeyAndVisible()
        
        var storyboard = UIStoryboard(name: "Main", bundle: nil)
        rootViewController = storyboard.instantiateViewControllerWithIdentifier("MyViewController")
        
        navigationController = UINavigationController(rootViewController: rootViewController)
        
        window.rootViewController = rootViewController
        window.addSubview(navigationController.view)
        
        
        return true
    }
同樣我們初始化window,navigationController,但是rootViewController我們是使用storyboard來初始化的,

var storyboard = UIStoryboard(name: "Main", bundle: nil) 首先根據名字Main獲得storyboard的引用,

rootViewController = storyboard.instantiateViewControllerWithIdentifier("MyViewController") 然後從storyboard根據Identifier例項化rootViewController,既然要根據Identifier,因此我們回到storyboard檔案為其新增ID。

打卡storyboard檔案,點選介面空白處或點選上面三個圖示的最左邊,選擇View Controller



開啟Inspector,新增Storyboard ID:MyViewController




到此,通過storyboard設計介面,程式碼連線建立NavigationController就完成了,下一次我們將為NavigationController新增更多的內容以及實現真實的跳轉。