【发布时间】:2017-06-07 06:02:33
【问题描述】:
我在UIView 上有一个扩展,它加载了特定类型和名称的笔尖:
extension UIView {
class func fromNib<T : UIView>() -> T? {
guard let nib = Bundle(for: T.self).loadNibNamed(String(describing: T.self), owner: nil, options: nil)?[0]
else {
return nil
}
return nib as? T
}
}
现在在我的Hint 类(它是UIView 的子类)中,我像这样使用上述扩展:
if let view = Hint.fromNib(){
self.addSubview(view)
view.frame = self.bounds
}
这不起作用,因为T.self 的结果始终是 UIView,即使 Hint 是调用 fromNib 方法的类。如果我尝试对这样的类进行硬编码:
Bundle(for: Hint.self).loadNibNamed(String(describing: Hint.self), owner: nil, options: nil)
然后一切正常。如何获取实际调用fromNib() 方法的类的类型名称?
这是我的 Hint 类:
class Hint:UIView {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
if let view = UIView.fromNib(){
self.addSubview(view)
view.frame = self.bounds
}
}
override init(frame: CGRect) {
super.init(frame: frame)
if let view = UIView.fromNib(){
self.addSubview(view)
view.frame = self.bounds
}
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
if let view = UIView.fromNib(){
self.addSubview(view)
view.frame = self.bounds
}
}
}
所以一切都很简单。一个 nib 文件只有一个标签和一个图像视图,但我想这与当前问题几乎无关。
【问题讨论】:
-
试试
let hint: Hint = UIView.fromNib()。我遇到了同样的问题。 -
在调用方法之前有没有试过定义类型?即
if let view: Hint = Hint.fromNib() -
哎呀.. Emilio 以 10 秒的优势击败了我
-
@EmilioPelaez 我刚刚尝试过,所以现在它不会崩溃,但是从笔尖加载的视图不可见(使用我提供的代码)......必须放置一些断点。 ..
-
@Whirlwind 我详细说明了一个答案。我认为使用
Hint?可能会更好,但我的方法没有使用可选参数所以我没有尝试过。
标签: ios swift generics uiview xib