swift - 为什么 awakeFromNib() 中的 View 为零?
问题描述
我正在练习 awakeFromNib。
UIView
我在 Main.storyboard 中有一个。这个 UIView 继承class CardView
.
代码如下
class ViewController: UIViewController {
@IBOutlet weak var cardView: CardView!
}
我有一个CardView.xib
. 在 CardView.xib 中,有一个默认的单个 UIView 继承了class CardView
. 在这个 UIView 内部,还有另一个继承了class CardContentView
. 当然,我有一个 CardView.swift,它有class CardView
.
代码如下
class CardView: UIView {
@IBOutlet weak var cardContentView: CardContentView!
override func awakeFromNib() {
cardContentView.layer.cornerRadius = 16
}
}
我有一个CardContentView.xib
. 在 CardContentView.xib 中,有一个UIView
继承了 default的默认单曲class UIView
。当然,我有一个 CardContentView.swift ,它有class CardContentView
.
代码如下
class CardContentView: UIView {
@IBOutlet var backgroundView: UIView!
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
private func commonInit(){
Bundle.main.loadNibNamed("CardContentView", owner: self, options: nil)
self.addSubview(backgroundView)
}
}
是的,我想CardContentView
通过.cardView
class CardView
但是当我运行时,错误弹出class CardView
错误行在func awakeFromNib
具体线路是cardContentView.layer.cornerRadius = 16
。
错误消息是Unexpectedly found nil while unwrapping an Optional value
。特别是,cardContentView = nil
。
我不知道为什么cardContentView = nil
。
我将 Xib 板class CardView
中的 cardContentView 链接到 CardView.swift 中。
我应该如何修改代码来运行它?
谢谢!
解决方案
首先,您需要连接主情节提要中的 cardView 插座,当然,您已经在 ViewController 中添加了一个视图。然后在您的 CardView 类中,您必须实例化 cardContentView 插座,因为在 CardView.xib 中您没有对 cardContentView 的任何引用。确保您已在 CardContentView.xib 中连接了 backgroundView 插座。
class CardView: UIView {
@IBOutlet weak var cardContentView: CardContentView!
override func awakeFromNib() {
super.awakeFromNib()
cardContentView = Bundle.main.loadNibNamed("CardContentView", owner: self, options: nil)!.first as! CardContentView
self.addSubview(cardContentView)
cardContentView.layer.cornerRadius = 16
//you can also get access to the subviews of cardContentView
//cardContentView.backgroundView.backgroundColor = .red
}
}
class CardContentView: UIView {
@IBOutlet var backgroundView: UIView!
override func awakeFromNib() {
backgroundView.backgroundColor = .yellow
}
override init(frame: CGRect) {
super.init(frame: frame)
//commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
//commonInit()
}
private func commonInit() {
}
}
推荐阅读
- hive - 如何知道 hive 支持的最大 sql 长度?
- pyspark - 迄今为止的火花数据框列字符串
- c++ - 如何使用 C++ 模板魔法来对类型进行模式匹配
- java - 尝试从 sqlite 表中读取 pdf 文件时结果集关闭异常
- reactjs - 如何同时渲染标签导航和堆栈导航
- swift - 如何从firebase读取数据,阻止不起作用?
- ios - 向 Broadcast Swift 4 添加图标和应用程序名称以及 Bundle ID
- python - Python Jira 不能 transition_issue 并抛出异常
- mongodb - Azure Cosmos MongoDB 迁移后无法插入/更新
- cakephp - 在多层前缀中自动化用户