web-dev-qa-db-fra.com

Charger UIViewController à partir du fichier nib séparé dans swift?

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é?

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

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()
15
Ankit Srivastava

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