这是我的Objective-C代码,我正在使用它为我的定制UIView加载nib:

-(id)init{

    NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"myXib" owner:self options:nil];
    return [subviewArray objectAtIndex:0];

}

Swift中的等效代码是什么?

推荐答案

Original Solution

  1. 我创建了一个XIB和一个名为SomeView的类(在
  2. 在XIB中,我将"文件的所有者"类更改为SomeView(在identity inspector中).
  3. 我在SomeView中创建了一个UIView插座.swift,将其链接到XIB文件中的顶层视图(为方便起见,将其命名为"视图").然后,我根据需要将其他出口添加到XIB文件中的其他控件中.
  4. 在某处看来.Swift ,我在"init with code"初始值设定项中加载了XIB.没有必要给"self "分配任何东西.加载XIB后,所有插座都将连接,包括顶层视图.唯一缺少的是将俯视图添加到视图层次 struct 中:

.

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加载自己的类.然后,只要UIView可以在项目中使用(在interface builder中或以编程方式使用),我就可以使用SomeView作为一个类.

Update - using Swift 3 syntax

在以下扩展中加载xib是作为一个实例方法编写的,然后可以由上面的初始化器使用:

extension UIView {

    @discardableResult   // 1
    func fromNib<T : UIView>() -> T? {   // 2
        guard let contentView = Bundle(for: type(of: self)).loadNibNamed(String(describing: type(of: self)), owner: self, options: nil)?.first as? T else {    // 3
            // xib not loaded, or its top view is of the wrong type
            return nil
        }
        self.addSubview(contentView)     // 4
        contentView.translatesAutoresizingMaskIntoConstraints = false   // 5 
        contentView.layoutAttachAll(to: self)   // 6 
        return contentView   // 7
    }
}
  1. 使用可丢弃的返回值,因为当所有插座都已连接时,调用者对返回的视图基本不感兴趣.
  2. 这是一个泛型方法,返回UIView类型的可选对象.如果无法加载视图,则返回nil.
  3. 正在try 加载与当前类实例同名的XIB文件.如果失败,则返回nil.
  4. 将顶层视图添加到视图层次 struct 中.
  5. 这一行假设我们正在使用约束来布局视图.
  6. 此方法添加顶部、底部、前导和;尾部约束-将视图附加到所有侧面的"self"(有关详细信息,请参见:https://stackoverflow.com/a/46279424/2274829)
  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.zero)  // 4.
      fromNib()  // 6.
   }
   // other methods ...
}
  1. SomeClass是从SomeClass加载其内容的UIView子类.xib文件."final"关键字是可选的.
  2. 用于在情节提要中使用视图的初始值设定项(请记住使用SomeClass作为情节提要视图的自定义类).
  3. 以编程方式创建视图时的初始值设定项(即:"let myView=SomeView()").
  4. 使用全零帧,因为此视图是使用自动布局布局的.
  5. &;6.使用扩展名加载xib文件.

信用:在这个解决方案中使用一个通用的扩展是受Robert下面的答案启发的.

Edit

Swift相关问答推荐

Swift concurrency reload/await,支持只执行成功并重试

按下一步后无法让文本字段切换焦点

如何让ScrollView缩小到合适的大小,并在没有黑客攻击的情况下占用最小空间

NSApplication是否需要NSApplicationDelegate?

使 tabview 垂直将视图移动到右侧 swift ui

除法中如果除以完全因数需要更长时间吗?

macOS SwiftUI: 如何触发删除一个项目?

如何延迟 swift 属性 didSet 使其每秒只触发一次

在 SwiftUI 中将属性显式设置为其默认值

闭包 - deinit self 对象的时间

RxSwift 提高性能

SwiftUI 视图的默认成员初始化器 VS 自定义初始化器

P384 公钥获取IncorrectParameterSize

将阻塞函数集成到 Swift 异步中

不要从 NumberFormatter 获取货币符号

如何在 Xcode 中的 UITests 下以通用方式访问后退栏按钮项?

如何快速制作虚线?

Swift 中 NSFetchRequest 的多个 NSPredicates?

Swift中switch 盒的详尽条件

Swift if 语句 - 多个条件用逗号分隔?