插座已连接,但在展开可选值时意外发现 nil
Posted
技术标签:
【中文标题】插座已连接,但在展开可选值时意外发现 nil【英文标题】:Outlet is connected, but Unexpectedly found nil while unwrapping an Optional value 【发布时间】:2018-08-04 07:49:40 【问题描述】:我正在尝试在 UITableViewCell 中设置 UITableView,并按照Is it possible to add UITableView within a UITableViewCell 的选定答案进行操作
这是包含内部 TableView 的 TableViewCell 类的代码:
import UIKit
class tvc_item: UITableViewCell, UITableViewDataSource, UITableViewDelegate
@IBOutlet weak var ivItem: UIImageView!
@IBOutlet weak var lblItemName: UILabel!
@IBOutlet weak var tvInner: UITableView!
var itemdata = Item()
override func awakeFromNib()
super.awakeFromNib()
setUpTable()
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
setUpTable()
override init(style: UITableViewCellStyle, reuseIdentifier: String?)
super.init(style: style, reuseIdentifier: reuseIdentifier)
override func layoutSubviews()
super.layoutSubviews()
//tvInner?.frame = CGRectMake(0.2, 0.3, self.bounds.size.width-5, self.bounds.size.height-5)
override func setSelected(_ selected: Bool, animated: Bool)
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
func setUpTable()
tvInner.delegate = self // Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
tvInner.dataSource = self
func numberOfSections(in tableView: UITableView) -> Int
return 1
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return itemdata.rows.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "cell_itemrow") as! cell_itemrow
cell.lblRowLabel.text = String(itemdata.rows[indexPath.row].size)
return cell
当我运行代码时,它死在这一行:
tvInner.delegate = self
有错误:
线程 1:致命错误:在展开可选值时意外发现 nil
所以我假设 tvInner 为 nil,但为什么呢?我该怎么办?
tvInner 的插座似乎连接正确,插座图标内显示一个黑圈。
【问题讨论】:
【参考方案1】:您需要覆盖awakeFromNib
并将setUpTable()
移动到此方法中。
【讨论】:
我现在添加了这个(并且我编辑了我的问题以显示当前代码)但它仍然给出了同样的错误。 @Gimmethe411 从init
中删除setUpTable
调用【参考方案2】:
好像您使用 xib 或故事板来配置 tvc_item 布局。
所以,最好的办法是
从代码中删除委托/数据源配置并在 Interface Builder 中进行配置,只需拖放即可删除:
override func awakeFromNib()
super.awakeFromNib()
setUpTable()
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
setUpTable()
func setUpTable()
tvInner.delegate = self // Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
tvInner.dataSource = self
在 IB 中配置:
如果你还想在代码中配置
删除所有 init 函数 只有 awakeFromNib 必须存在【讨论】:
我试过了,但它说'必需'初始化程序'init(coder:)'必须由'UITableViewCell'的子类提供 移除所有被覆盖的初始化函数! 编译器说需要初始化程序,因为您有一个被覆盖的初始化程序。删除覆盖。【参考方案3】:您似乎忘记将 setupTable() 方法放在 override init 上。
【讨论】:
以上是关于插座已连接,但在展开可选值时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章