插座已连接,但在展开可选值时意外发现为零

时间:2018-08-04 07:49:41

标签: ios swift uitableview

我正在尝试在UITableViewCell内设置一个UITableView,并且遵循对Is it possible to add UITableView within a UITableViewCell

的选定答案

这是我的TableViewCell类的代码,其中包含内部TableView:

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为零,但是为什么呢?那我该怎么办?

tvInner的插座似乎已正确连接,并且插座图标内显示一个黑圈。

3 个答案:

答案 0 :(得分:2)

您需要覆盖awakeFromNib并在此方法内移动setUpTable()

答案 1 :(得分:1)

似乎您使用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中配置:

UITableView in UICollectionViewCell

如果您仍要在代码中进行配置

  • 删除所有 init 函数
  • 只有awakeFromNib必须在那里

答案 2 :(得分:0)

似乎您忘记了将setupTable()方法放在覆盖init上。