故事板中的可重用笔尖

Reusable Nibs in Storyboards

我正在寻找一种制作 nib 的方法,然后我可以将这些 nib 嵌入到故事板中并在所有 IBOutlets 正确实例化的情况下重复使用。我能够使用 this tutorial.

的修改版本让它工作

使它起作用的步骤是:

  1. 制作自定义view subclass和相应的nib
  2. 设置File's Owner为自定义视图子class
  3. 添加 UIView 作为 nib 视图的直接后代(这是我们的内容视图)
  4. 在您的视图 class 中创建一个名为 contentViewUIView 类型的 IBOutlet 并将 nib 中的内容视图内容添加到该出口
  5. awakeFromNib 中执行以下操作:

    override func awakeFromNib() {
        super.awakeFromNib() //call super
        NSBundle.mainBundle().loadNibNamed("MyView", owner: self, options: nil)
        self.contentView.translatesAutoresizingMaskIntoConstraints = false
        self.addSubview(self.contentView)
    
        self.addEdgeConstraintWithAttribute(.Left, withSubview: self.contentView)
        self.addEdgeConstraintWithAttribute(.Top, withSubview: self.contentView)
        self.addEdgeConstraintWithAttribute(.Right, withSubview: self.contentView)
        self.addEdgeConstraintWithAttribute(.Bottom, withSubview: self.contentView)
    }
    

这个过程工作正常,但我不明白它是如何工作的。有没有更好的方法来实现同样的目标?

这一切魔法都来自 NSNibAwaking 协议的 awakeFromNib

"The -awakeFromNib method is called for every object that is instantiated when a nib file is loaded..." - e.James

比方说,你制作了一个 class 和一个名为 MyView 的笔尖并完成了上述所有步骤,现在当你在你的故事板中添加一个 UIView 并设置它class 到 MyView 和 运行 应用程序。事情是这样的。

  • 您的情节提要加载所有视图并为您的视图调用 awakeFromNib MyView.
  • 您的 awakeFromNib 然后触发名为 MyView.
  • 的 nib 的加载
  • 您从 Nib 实例化视图中获取内容视图并将其添加到故事板实例化视图并设置其约束。
  • 注意 loadNibNamed 方法,您发送 self 作为所有者,所以 当笔尖被取消存档并加载时,它将所有 IBOutlets 设置为 已发送的 self,这就是为什么您的 IBOutlet 起作用的原因,即 self.contentView 因为 contentView 现在有来自 nib 的视图。