Years.IM

swift2.0中UIViewController默认加载的xib文件

UIViewController初始化的方式,以MyViewController为例

通过storyboard加载

从ios6开始,苹果建议使用storyboard做界面开发,生成的项目文件也都有storyboard影子,但在多人开发的情况下,storyboard就是坑啊...
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("ViewController") 
这里可以在精简一下, 充分利用swift特性来精简代码(函数、泛型)
func ViewControllerFromStoryboard(identifier: String) -> T{
    return ViewControllerFromStoryboard(nil, identifier: identifier)
}

func ViewControllerFromStoryboard(name: String?, identifier: String) -> T{
    let storyboard = UIStoryboard(name: name ?? "Main", bundle: nil)
    return storyboard.instantiateViewControllerWithIdentifier(identifier) as! T
}

let vc: ViewController = ViewControllerFromStoryboard("ViewController")

通过实例化方法

let vc = ViewController()
let mvc = ViewController(nibName: "ViewController", bundle: nil)
经测试,ios9在使用方法ViewController()实例化时,会默认加载同名ViewController.xib, ios8则默认不加载,这样导致在实例化一个ViewController的时候,要写一大串代码,很不友好,下面将提出一种方案解决该问题。

实现ViewController默认加载同名xib

新建BaseViewController, 重写init方法,其他ViewController继承于Base。
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
    let className = String(self.dynamicType)
    super.init(nibName: nibNameOrNil ?? className, bundle: nibBundleOrNil)
}
required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}
完。