从swift中单独的nib文件加载UIViewController?

Sun*_*hah 22 iphone objective-c uiviewcontroller ios swift

我带了一个带有单独nib文件的ViewController.我的初始根视图控制器在storyBoard中设置.现在问题是当我推送到这个控制器时,没有调用View hireachy方法(ViewDidLoad,ViewWillApper等).

代码(视图已加载但方法未调用)

var viewController = UIViewController(nibName: "OfferDetailViewController", bundle: nil) as OfferDetailViewController
 self.navigationController?.pushViewController(viewController, animated: true);
Run Code Online (Sandbox Code Playgroud)

如果我使用故事板它的工作正常,同样的事情.

    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    var viewController = mainStoryboard.instantiateViewControllerWithIdentifier("offer") as OfferDetailViewController     
   self.navigationController?.pushViewController(viewController, animated: true);
Run Code Online (Sandbox Code Playgroud)

问题:使用storyboard View层次结构方法是调用但不是使用单独的nib文件?

ael*_*lam 46

var viewController = OfferDetailViewController(nibName: "OfferDetailViewController", bundle: nil)
Run Code Online (Sandbox Code Playgroud)


Ank*_*ava 16

这是一个很好的通用方法......

extension UIViewController {
    class func loadFromNib<T: UIViewController>() -> T {
         return T(nibName: String(describing: self), bundle: nil)
    }
}

let vc : OfferDetailViewController = OfferDetailViewController.loadFromNib()
Run Code Online (Sandbox Code Playgroud)


dr *_* OX 6

类型铸造的解决方案:

extension UIViewController {
    static func initFromNib() -> Self {
        func instanceFromNib<T: UIViewController>() -> T {
            return T(nibName: String(describing: self), bundle: nil)
        }
        return instanceFromNib()
    }
}
Run Code Online (Sandbox Code Playgroud)

享受:

let testVC = TestVC.initFromNib()
testVC.someCustomParam = "someValue"
Run Code Online (Sandbox Code Playgroud)