用Swift完成不同View Controller之間的切換,swiftcontroller
之前用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
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,你知道怎麼做。