在Swift中从nib加载UIView
这里是我的Objective-C代码,我用来为我的自定义UIView加载一个nib:
-(id)init{ NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"myXib" owner:self options:nil]; return [subviewArray objectAtIndex:0]; } Swift中的等效代码是什么?
Orignal解决方案
>我创建了一个XIB和一个名为SomeView的类(使用相同的名称 。 class SomeView: UIView { required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) NSBundle.mainBundle().loadNibNamed("SomeView",owner: self,options: nil) self.addSubview(self.view); // adding the top level view to the view hierarchy } ... } 注意,这样我得到一个类从nib加载自己。我可以使用SomeView作为一个类,当UIView可以在项目中使用(在界面构建器或编程)。 更新 – 使用Swift 3语法 在以下扩展中加载xib将被写为一个实例方法,然后可以像上面那样使用初始化器: extension UIView { @discardableResult // 1 func fromNib<T : UIView>() -> T? { // 2 guard let view = Bundle.main.loadNibNamed(String(describing: type(of: self)),options: nil)?[0] as? T else { // 3 // xib not loaded,or it's top view is of the wrong type return nil } self.addSubview(view) // 4 view.translatesAutoresizingMaskIntoConstraints = false // 5 view.layoutAttachAll(to: self) // 6 return view // 7 } } >使用可废弃的返回值,因为当所有插座已经连接时,返回的视图对呼叫者几乎不感兴趣。 调用方法可能如下所示: final class SomeView: UIView { // 1. required init(coder aDecoder: NSCoder) { // 2 - storyboard initializer super.init(coder: aDecoder) fromNib() // 5. } init() { // 3 - programmatic initializer super.init(frame: CGRect()) // 4. fromNib() // 6. } // other methods ... } > SomeClass是一个UIView子类,它从SomeClass.xib文件加载其内容。 “final”关键字是可选的。 信用:在这个解决方案中使用通用扩展是受到罗伯特的答案的启发下面。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |