1. 程式人生 > >用Swift完成不同View Controller之間的切換

用Swift完成不同View Controller之間的切換

之前用objective-c開發時,頁面之間的切換很容易。其實用swift沒有很大的變化,如果你是用storyboard完成的介面,基本上是同樣的方式,只不過在程式碼部分寫成swift風格的就行了。

今天在實驗開發一個簡單的小程式時,卻遇到了一些bug,後來還是求助stackoverflow上的大神解決了問題,在此做下記錄。

我的程式結構是這樣的,在一個頁面A中有個按鈕,然後點選按鈕以後,切換到另一個頁面B。A和B都在同一個storyboard中。

這裡先說下通用的方法:

  • 手動用程式碼建好的view controller,即不是在storyboard中建立的:
var vc = ViewController() 
self.presentViewController(vc, animated: true, completion: nil) 
return

  • 在storyboard中建立的可以用下面的程式碼:
let sb = UIStoryboard(name:"Main", bundle: nil)
let vc = sb.instantiateViewControllerWithIdentifier("tabBarController") as ViewController 
self.presentViewController(vc, animated: true, completion: nil)

這裡的tabBarController 是你在storyboard中對相應的viewcontroller開啟其identifier inspector,然後對其storyboard ID起的名字。

所以我的程式就是,在A的類中,定義下面的button action:

@IBAction func login(sender: UIButton) {
        let sb = UIStoryboard(name: "Main", bundle: nil)
        let vc = sb.instantiateViewControllerWithIdentifier("tabBarController") as UITabBarController
        self.presentViewController(vc, animated: true, completion: nil)
    }
注意我這裡as後並沒有寫成ViewController,bug就出現在這裡。當我最初寫的是viewController時,總會出bug,提示這樣:



我Google了關於dynamic Cast Class Unconditional也沒有找到太多有用的資訊,沒有辦法只有求助stackoverflow的大神了,很快就有人回覆:


原來是因為我從storyboard讀到的被命名為tabBarController的控制元件不能被強制轉換(as)成viewcontroller,因為它其實是一個UITabBarController,也就是說,as後面你想要強制轉換成的一定要與storyboard中的保持一致。

所以,程式碼就那麼幾行,但是不能生搬硬套。

如果你的storyboard中是viewcontroller,就as成viewcontroller,如果是UITabBarController就as成為UITabBarController,如果是其它的諸如UITableViewController,你知道怎麼做。