出列可重复使用的单元格总是崩溃

dequeue reusable cell always crashes

在此代码中,我添加了编程 VC:

@IBAction func addPerson(_ sender: UIBarButtonItem) {
        let controller = CNContactPickerViewController()
        controller.delegate = self
        navigationController?.present(controller, animated: true, completion: nil)
    }

在这里,当我点击一个联系人(将信息显示到单元格中,然后我想为 phones/emails 创建一个复选框以在我的第一个 VC)

func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
        let vc = EditContactViewController()
        self.navigationController?.pushViewController(vc, animated: true)

我为下一个单元格创建了一个 class 并且我将标识符设置为故事板中的单元格 当我在 tableView cellForRowAtIndexPath

中执行此操作时
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as? ConfigCell

return cell!

这给了我:

fatal error: unexpectedly found nil while unwrapping an Optional value

我也试过 withIdentifier,forIndexPath 并且它说:

2016-11-12 01:35:28.626 iEvents3[2637:47714] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

我删除了重用标识符并将其重新放回去,清理了应用程序,重新启动,一切。

感谢您的宝贵时间!

你有那个细胞作为 xib 吗?您是否将单元格添加到 table 视图?如果是这种情况,试试这个

@IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
self.tableView.register(UINib(nibName: "ConfigCell",bundle: nil), forCellReuseIdentifier: "cell")
}

这可能有几个原因:

  1. 如果你的 UITableViewCell 在控制器本身,然后检查 重用标识符 是否设置为 "cell"

  2. 如果您的 UITableViewCell 有单独的 .xib,那么

    a) 在控制器 viewDidLoad() 的 table 视图中注册单元格的 .nib

    self.tableView.register(UINib(nibName:"CustomTableViewCell"), forCellWithReuseIdentifier: "cell")
    

    只有当您确定 outlettable view 已设置时才注册 .nib。否则,如果 outlet if table view 仍然是 nil,它不会注册你手机的 .nib

    b) 检查重用标识符是否设置为"cell"

单元格展开时应用程序崩溃

func tableView(_ tableView: SLExpandableTableView!, willExpandSection section: UInt, animated: Bool) {

}

func tableView(_ tableView: SLExpandableTableView!, didExpandSection section: UInt, animated: Bool)
{
    let indexPath = IndexPath(row: 0, section: Int(section))
    let cell: SLExpandableHeaderCell = (tableView.cellForRow(at: indexPath) as! SLExpandableHeaderCell)

    cell.empProfImage?.image = UIImage(named: "upArrowGrey.png")

    //        let imgCategorySymbol: UIImageView = (cell.viewWithTag(5030) as! UIImageView)
    //        imgCategorySymbol.image = UIImage(named: "upArrowGrey.png")

    for i in 0..<arrCategoriesServices.count
    {
        if !selectedSectionIndex.contains("\(i)") && i != Int(section) {

            tableView.collapseSection(i, animated: true)
        }
    }
}

func tableView(_ tableView: SLExpandableTableView!, willCollapseSection section: UInt, animated: Bool) {
    let indexPath = IndexPath(row: 0, section: Int(section))

    let cell: SLExpandableHeaderCell = (tblExpandableView.cellForRow(at: indexPath) as! SLExpandableHeaderCell)
    cell.empProfImage?.image = UIImage(named: "downArrowGrey.png")

    //        let imgCategorysymbol: UIImageView? = (cell.viewWithTag(5030) as! UIImageView)
    //        imgCategorysymbol?.image = UIImage(named: "downArrowGrey.png")
}

func tableView(_ tableView: SLExpandableTableView, canChangeSection section: Int) -> Bool {
    if collapsingSection != section {
        return true
    }
    else {
        return false
    }
}

func tableView(_ tableView: SLExpandableTableView!, didCollapseSection section: UInt, animated: Bool) {

}

func tableView(_ tableView: SLExpandableTableView, canExpandSection section: Int) -> Bool
{
    return true
}


func tableView(_ tableView: SLExpandableTableView!, needsToDownloadDataForExpandableSection section: Int) -> Bool
{
    return false
}

func tableView(_ tableView: SLExpandableTableView!, expandingCellForSection section: Int) -> UITableViewCell
{
    var cell: SLExpandableHeaderCell!

    if cell == nil
    {
        cell = tblExpandableView.dequeueReusableCell(withIdentifier: headerCell) as! SLExpandableHeaderCell
    }


    let label = UILabel()
    label.frame = CGRect(x: CGFloat(10), y: CGFloat(10), width: CGFloat(100), height: CGFloat(25))
    cell.addSubview(label)


    cell.empProfImage?.image = UIImage(named: "downArrowGrey.png")
    cell?.selectionStyle = .none

    let cat: CategoryModel = (arrCategory[section] as! CategoryModel)
    label.text = cat.categoryName
    print("Expanding table for categoty : \(cat.categoryName)")
  //  cell.textLabel?.frame = frame
  //  cell?.textLabel?.text = cat.categoryName

// Util.setCategoryDetailFontColorAndSize(label: (cell?.textLabel!)!, labelText: cat.categoryName) Util.setCategoryDetailFontColorAndSize(标签:标签,labelText:cat.categoryName) cell?.textLabel?.backgroundColor = UIColor.clear

    return cell!
}

public func tableView(_ tableView: SLExpandableTableView!, downloadDataForExpandableSection section: Int)
{

}

确保没有'!'登录接口插座连接

即使您没有单元格的 xib,您也可能需要注册它:

tableView.register(UITableViewCell.self, forCellReuseIdentifier: "MyCell")

在我的例子中,这是一个愚蠢的错误,只是 .xib 名称中的一个印刷错误,但我花了太多时间才找到它,因为名称很长而且很难看到错误,所以我正在寻找其他原因。 现在看起来很明显..但是狗屎发生了:)

如果您遇到这种情况,我希望能节省您的时间。

对我来说,TableView Cell 设置为静态内容而不是动态内容,因为我希望它根据我的 collection 生成 X 个单元格。一个很好的线索是,我在 Xcode.

的层次结构概览面板中的 Table View Cell 上方看到一个带有蓝色立方体的奇怪 Header 文本

这是将单元格设置为动态的视觉效果。