我使用以下代码强制UIView
的子类从名称为实际类名的XIB文件加载:
class NibView : UIView {
override func awakeAfter(using aDecoder: NSCoder) -> Any? {
guard isRawView() else { return self }
for view in self.subviews {
view.removeFromSuperview()
}
let view = instanceFromNib()
return view
}
func isRawView() -> Bool {
// What here?
}
}
isRawView()
方法的目的是确定此视图是从代码创建的,还是从相应的XIB文件加载的。
到目前为止我使用的实现是:
func isRawView() -> Bool {
// A subview created by code (as opposed to being deserialized from a nib)
// has 2 subviews, both implementing the `UILayerSupport` protocol
return
self.subviews.count == 2 &&
self.subviews.flatMap(
{ $0.conforms(to: UILayoutSupport.self) ? $0 : nil }).count == 2
}
使用技巧来确定视图是否是从代码创建的,因为在这种情况下它只包含2个子视图,两者都实现了UILayoutSupport
协议。
当从代码中实例化NibView
子类时,这很有效。但是如果视图是作为故事板中视图控制器的一部分创建的,则它不起作用(对于视图控制器和从XIB文件加载的视图,可能会发生相同的情况)。
长话来解释我的问题的原因:是否有办法让UIView
知道它是否已从XIB文件加载,可能还有该文件的名称? 或者,否则,另一种实现isRawView()
方法的方法,应该:
false
true
答案 0 :(得分:0)
使用提供的init
函数。
init(frame:)
- >来自代码init(coder:)
- >来自笔尖示例代码:
override init(frame: CGRect) {
super.init(frame: frame)
print("From code")
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
print("From nib")
}
我可以打印出类名:
print(NSStringFromClass(type(of: self)).components(separatedBy: ".").last ?? "Couldn't get it")
你应该可以使用它,也许稍作调整,以获得你需要的东西。