此问题与我上一个问题的处理代码相同。
(上一个问题是Why is this View nil in awakeFromNib()?)
但是完全不同的方法。
这不是重复的问题。
因此,让我重组我的问题。
首先,让我总结一下我的项目。
由于先前的回答,我现在可以重用xib。 这是CardContentView.xib
代码在下面
@IBDesignable class CardContentView: UIView {
@IBOutlet weak var backgroundView: UIView!
@IBInspectable var nibName:String?
var contentView: UIView?
override func awakeFromNib() {
super.awakeFromNib()
xibSetup()
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
xibSetup()
contentView?.prepareForInterfaceBuilder()
}
func xibSetup(){
guard let view = loadViewFromNib() else { return }
view.frame = self.bounds
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
addSubview(view)
contentView = view
}
func loadViewFromNib() -> UIView? {
guard let nibName = nibName else { return nil }
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: nibName, bundle: bundle)
return nib.instantiate(withOwner: self, options: nil).first as? UIView
}
}
这是CardView.xib,该属性遵循“类CardContentView”
代码在下面
class CardView: UIView {
@IBOutlet weak var cardContentView: CardContentView!
override func awakeFromNib() {
cardContentView.layer.cornerRadius = 16
}
}
代码在下面
class ViewController: UIViewController {
@IBOutlet weak var cardView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
}
}
但是,我想在ViewController中将类'CardView'重用为'cardView'属性。
我想将'background'属性更改为'cardView'属性(简单来说,我想将CardContentView中的黄色框更改为蓝色框!)。
我想使'cardView'属性具有过渡效果。
但是,我无法进行扩展,因为它不在UIView类中,而在ViewController类中。
因此,我需要制作另一个UIView类。
这就是为什么我单独制作CardView类。
(当然,我想通过制作另一个文件来整齐地组织代码。)
因此,我尝试了两种不同的方法。
将属性“ cardView”类设置为CardView,并将其连接到ViewController。
class ViewController: UIViewController {
@IBOutlet weak var cardView: CardView!
override func viewDidLoad() {
super.viewDidLoad()
}
}
将'CardView'类投射到ViewController中的其他属性
override func viewDidLoad() {
super.viewDidLoad()
let tappedView = self.cardView as! CardView
self.view.addSubview(tappedView)
}
但是他们两个都会出错。
1.当我使“ @IBOutlet弱var cardView:CardView!”时,它引发错误消息,“在展开可选值cardContentView = nil时意外地找到nil”。
2.当我制作'tappedView = self.cardView为!
如何解决此问题?
请帮帮我!
答案 0 :(得分:-1)
awakeFromNib()
中,您没有调用super.awakeFromNib()
。xibSetup()
)相同的逻辑({{1}})从相应的XIB加载 CardView 它的XIB。