故事板中的可重用笔尖
Reusable Nibs in Storyboards
我正在寻找一种制作 nib 的方法,然后我可以将这些 nib 嵌入到故事板中并在所有 IBOutlets
正确实例化的情况下重复使用。我能够使用 this tutorial.
的修改版本让它工作
使它起作用的步骤是:
- 制作自定义view subclass和相应的nib
- 设置
File's Owner
为自定义视图子class
- 添加
UIView
作为 nib 视图的直接后代(这是我们的内容视图)
- 在您的视图 class 中创建一个名为
contentView
的 UIView
类型的 IBOutlet
并将 nib 中的内容视图内容添加到该出口
在 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 的视图。
我正在寻找一种制作 nib 的方法,然后我可以将这些 nib 嵌入到故事板中并在所有 IBOutlets
正确实例化的情况下重复使用。我能够使用 this tutorial.
使它起作用的步骤是:
- 制作自定义view subclass和相应的nib
- 设置
File's Owner
为自定义视图子class - 添加
UIView
作为 nib 视图的直接后代(这是我们的内容视图) - 在您的视图 class 中创建一个名为
contentView
的UIView
类型的IBOutlet
并将 nib 中的内容视图内容添加到该出口 在
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 的视图。