首页 文章

Swift:在实例化viewcontroller时加载XIB

提问于
浏览
2

我最近将我的项目升级到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中这是必要的而不是客观的?

1 回答

  • 5

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

    @objc(CRMyViewController) class CRMyViewController: UIViewController {
    
    }
    

    这应该使用错误的名称解决 _loadViewFromNibNamed:bundle: 的问题 .

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

相关问题