web-dev-qa-db-ja.com

迅速に別のnibファイルからUIViewControllerをロードしますか?

別の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ファイルでは呼び出されませんか?

21
Sunny Shah
var viewController = OfferDetailViewController(nibName: "OfferDetailViewController", bundle: nil)
45
aelam

これがニースの一般的なアプローチです...

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

let vc : OfferDetailViewController = OfferDetailViewController.loadFromNib()
15

型キャストのソリューション:

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"
6
dr OX