別のnibファイルでViewControllerを1つ取得しました。私の最初のルートViewControllerはstoryBoardに設定されています。問題は、このコントローラーにプッシュしたときに、View hireachyメソッドが呼び出されないことです(ViewDidLoad、ViewWillApperなど)。
コード(ビューはロードされていますが、メソッドは呼び出していません)
var viewController = UIViewController(nibName: "OfferDetailViewController", bundle: nil) as OfferDetailViewController
self.navigationController?.pushViewController(viewController, animated: true);
絵コンテでうまくやれば同じことです。
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var viewController = mainStoryboard.instantiateViewControllerWithIdentifier("offer") as OfferDetailViewController
self.navigationController?.pushViewController(viewController, animated: true);
問題:ストーリーボードビューでは、階層メソッドが呼び出されますが、個別のnibファイルでは呼び出されませんか?
var viewController = OfferDetailViewController(nibName: "OfferDetailViewController", bundle: nil)
これがニースの一般的なアプローチです...
extension UIViewController {
class func loadFromNib<T: UIViewController>() -> T {
return T(nibName: String(describing: self), bundle: nil)
}
}
let vc : OfferDetailViewController = OfferDetailViewController.loadFromNib()
型キャストのソリューション:
extension UIViewController {
static func initFromNib() -> Self {
func instanceFromNib<T: UIViewController>() -> T {
return T(nibName: String(describing: self), bundle: nil)
}
return instanceFromNib()
}
}
楽しみ:
let testVC = TestVC.initFromNib()
testVC.someCustomParam = "someValue"