博客> 关于使用Swift,iOS8系统不能自动加载xib布局
关于使用Swift,iOS8系统不能自动加载xib布局
2017-11-20 07:36 评论:0 阅读:355 梧桐一叶
swift iOS8 手动加载xib
    最近使用Swift的在开发项目,起初一直在iOS9的模拟器运行,并没有发现这个问题,偶然的一次机会拿来一台iOS8.4的真机运行,发现只要是运行到使用xib布局的界面都会崩溃,然后提示是某某控件是空的,不存在的,例如像这样的错误提示fatal error: unexpectedly found nil while unwrapping an Optional value,但是用纯代码写的界面就运行正常,很是奇怪
    经过半天的资料查询,发现iOS8系统下是需要手动加载xib的,即你需要在你的controller类里面手动添加如下三个方法来加载xib

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) } convenience init(){ let nibNameOrNil = String?("controller的名字") self.init(nibName:nibNameOrNil,bundle: nil) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }

完整示例代码展示: import UIKit

class GNMeBaseViewController: UIViewController {

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    //println(nibName);
}
convenience init() {
    var nibNameOrNil = String?("GNMeBaseViewController")

   //考虑到使用Swift创建viewController时,可能没有勾选xib,即xib文件可能不存在或被删,所以加入判断,以防应用崩溃,如果确保xib一定存在,就可以不用添加这个判断了
   if NSBundle.mainBundle().pathForResource(nibNameOrNil, ofType: "xib") == nil{  
         nibNameOrNil = nil
    }

    self.init(nibName: nibNameOrNil, bundle: nil)
}
required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

override func viewDidLoad() {

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
收藏
1
sina weixin mail 回到顶部