CustomView
和 CustomView.xib
之间并没有直接的代码关联,它们的关联实际上是通过手动设置 File's Owner
和 xib
的加载代码来实现的。因此,是否设置 CustomView
作为 CustomView.xib
的 class
和 File's Owner
,取决于你是否希望通过 CustomView.xib
与 CustomView
类进行交互(例如,连接 IBOutlet
或处理 IBAction
)。下面是详细解释:
-
CustomView.xib
的class
和File's Owner
的设置
File's Owner
:决定哪个对象拥有(控制)这个.xib
文件中的视图和控件。它是一个占位符,表示当.xib
文件加载时,哪个类会处理控件的IBOutlet
和IBAction
。如果你希望将CustomView.xib
中的控件和CustomView
类的IBOutlet
进行连接,则File's Owner
必须设置为CustomView
。
-
CustomView.xib
中的class
:这仅用于指定.xib
文件中的顶级视图的类类型。如果你希望.xib
文件的顶级视图是CustomView
类的实例,那么你可以将class
设置为CustomView
。否则,默认的UIView
也可以。- 是否必须设置
CustomView
为class
和File's Owner?
- 是否必须设置
File's Owner
设置为CustomView
:
必须这样做如果你希望通过IBOutlet
和IBAction
与CustomView
交互。设置File's Owner
为CustomView
是必要的,因为这告诉系统,CustomView
类将负责管理.xib
文件中的视图和事件。xib
顶级视图的class
设置为CustomView
:
这不是严格必要的,除非你希望.xib
顶级视图的类型是 CustomView。如果顶级视图是UIView
或其他类,它也可以正常工作,视具体需求而定。- 常见的使用场景和如何设置
场景 1:CustomView
是一个自定义视图,并希望加载和显示 CustomView.xib
中的控件
在这个情况下:
File's Owner:应该设置为 CustomView
,以便在加载时将 .xib
文件中的控件连接到 CustomView
类的 IBOutlet
。
class:可以是 CustomView
,这样 .xib
文件的顶级视图就是 CustomView
类的实例。
实现步骤:
1.在 xib
文件中,设置 File's Owner
为 CustomView
。
2.设置 CustomView.xib
顶级视图的 class
也为 CustomView
。
3.编写代码加载 CustomView.xib
并将其内容添加到视图中:
class CustomView: UIView {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var imageView: UIImageView!
override init(frame: CGRect) {
super.init(frame: frame)
loadFromNib()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
loadFromNib()
}
private func loadFromNib() {
let nib = UINib(nibName: "CustomView", bundle: nil)
if let view = nib.instantiate(withOwner: self, options: nil).first as? UIView {
view.frame = self.bounds
addSubview(view)
}
}
}
场景 2:CustomView
只是容器,而 .xib
视图是其他类类型(如 UIView
)
如果 CustomView
是一个简单的视图容器,你不需要将File's Owner
或顶级视图 class
设置为 CustomView
。在这种情况下,你可以让 .xib
顶级视图保持为 UIView(或其他),而不必与 CustomView
类强关联。
例如:
-
File's Owner
:可以设置为nil
,因为不需要与类的属性进行绑定。 -
class
:可以设置为UIView
,因为你不需要自定义行为。
这种情况下,加载 xib
时不需要绑定 File's Owner
,只需添加顶级视图即可:
class CustomView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
loadFromNib()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
loadFromNib()
}
private func loadFromNib() {
let nib = UINib(nibName: "SomeOtherView", bundle: nil)
if let view = nib.instantiate(withOwner: nil, options: nil).first as? UIView {
view.frame = self.bounds
addSubview(view)
}
}
}
总结
File's Owner
:必须设置为 CustomView
如果你希望通过 IBOutlet
和 IBAction
进行交互。
class
:顶级视图的 class
是否为 CustomView
取决于你是否希望 .xib
文件的顶级视图是 CustomView
类的实例。如果不需要特殊的自定义行为,可以保留为 UIView
。