Swift:在实例化viewcontroller时加载XIB

时间:2015-01-25 23:42:33

标签: ios swift uiviewcontroller xib

我最近将我的项目升级到Swift,我试图弄清楚如何动态地实例化我的XIB,同时保持对我的viewcontrollers的强引用。我讨厌不得不调用NSBundle.mainBundle().loadNibNamed("someXib"),因为你的viewcontroller的字符串表示可能会使它容易出现拼写错误,很难记住每个XIB的名称,如果我愿意的话,很难重命名XIB。

在objective-c中,我只是实例化viewcontroller并像这样推送它:

CRMyViewController *myVC = [CRMyViewController new];
[self.navigationController presentViewController:myVC animated:YES completion:nil];

这允许我强烈引用我的viewcontrollers(及其相关的XIB),如果我拼错或重命名了我的viewcontroller,我的项目将无法编译。

当我尝试这种方法引用Swift-XIB时,我的视图从未加载。但是,通过简单地覆盖viewcontroler中的loadView,我能够接近我想要的东西:

override func loadView() {              
    NSBundle.mainBundle().loadNibNamed("CRMyViewController", owner:self, options:nil) 
}

这与我想要的很接近,因为我只对xib名称进行了一次硬编码(并在实际的viewcontroller中),但我仍然更喜欢更动态的方法。

有没有办法动态加载Swift-XIB和viewcontroller?我唯一能想到的是创建自己的基本viewcontroller并以更动态的方式覆盖loadView:

override func loadView() {        
    var className:NSString = NSStringFromClass(self.classForCoder)
    className = className.componentsSeparatedByString(".").last as NSString
    NSBundle.mainBundle().loadNibNamed(className, owner:self, options:nil)
}

有没有更好的方法来加载XIB和viewcontroller?为什么在Swift中这是必要的而不是客观的c?

1 个答案:

答案 0 :(得分:5)

您可以通过在@objc块中指定类来指定类的名称:

@objc(CRMyViewController) class CRMyViewController: UIViewController {

}

这应该使用错误的名称修复_loadViewFromNibNamed:bundle:的问题。

你可以在这里找到关于类名如何在Swift中工作的更多内容:Get class name of object as string in Swift