J'avais pris un ViewController avec un fichier nib séparé. et mon viewcontroller racine initial est défini dans le storyBoard. Maintenant, le problème est que lorsque je pousse sur ce contrôleur, les méthodes View hireachy ne sont pas appelées (ViewDidLoad, ViewWillApper, etc.).
Code (La vue est chargée mais les méthodes n'appellent pas)
var viewController = UIViewController(nibName: "OfferDetailViewController", bundle: nil) as OfferDetailViewController
self.navigationController?.pushViewController(viewController, animated: true);
La même chose si je fais avec le storyboard, ça marche bien.
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var viewController = mainStoryboard.instantiateViewControllerWithIdentifier("offer") as OfferDetailViewController
self.navigationController?.pushViewController(viewController, animated: true);
Problème: Avec le storyboard, les méthodes de hiérarchie appellent mais pas avec le fichier nib séparé?
var viewController = OfferDetailViewController(nibName: "OfferDetailViewController", bundle: nil)
Voici une belle approche générique ...
extension UIViewController {
class func loadFromNib<T: UIViewController>() -> T {
return T(nibName: String(describing: self), bundle: nil)
}
}
let vc : OfferDetailViewController = OfferDetailViewController.loadFromNib()
solution avec type casting:
extension UIViewController {
static func initFromNib() -> Self {
func instanceFromNib<T: UIViewController>() -> T {
return T(nibName: String(describing: self), bundle: nil)
}
return instanceFromNib()
}
}
jouissance:
let testVC = TestVC.initFromNib()
testVC.someCustomParam = "someValue"