插座已连接,但在展开可选值时意外发现 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的主要内容,如果未能解决你的问题,请参考以下文章

XCode 8:在展开可选值时意外发现 nil

URL 错误:在展开可选值时意外发现 nil:文件

如何防止致命错误:在展开可选值时意外发现 nil

Swift:错误:在隐式展开可选值时意外发现 nil

UIPickerView:在展开可选值时意外发现 nil

致命错误:在展开可选值时意外发现 nil - 为啥?