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

时间:2016-11-11 23:38:40

标签: swift model-view-controller contactpicker

在这段代码中我添加了编程VC:

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

这里我点击联系人时使用另一个VC(将信息显示在单元格中,然后我想在我的第一个VC中显示电话/电子邮件的复选框)

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

我为下一个单元格创建了一个类,我将标识符设置为storyboard中的单元格 当我在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] ***终止app到期   未被捕获的异常' NSInternalInconsistencyException',原因:   '无法使用标识符单元格将单元格出列 - 必须注册一个笔尖   或标识符的类或连接原型单元格   故事板'

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

感谢您的时间!

7 个答案:

答案 0 :(得分:4)

这可能有几个原因:

  1. 如果控制器本身有UITableViewCell,请检查重复使用标识是否设置为"cell"

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

    a)使用控制器的viewDidLoad()中的表格视图注册单元格的.nib

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

    仅当您确定.nib设置为outlet时才注册table view。否则,如果outlet如果table view仍为nil,则不会注册您的单元格的.nib

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

答案 1 :(得分:3)

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

enter image description here

答案 2 :(得分:1)

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

@IBOutlet weak var tableView: UITableView!

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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.setCategoryDe​​tailFontColorAndSize(label:(cell?.textLabel!)!, labelText:cat.categoryName)         Util.setCategoryDe​​tailFontColorAndSize(label:label,labelText:cat.categoryName)         cell?.textLabel?。backgroundColor = UIColor.clear

    return cell!
}

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

}

答案 5 :(得分:0)

在我的情况下,这是一个愚蠢的错误,只是以.xib为名的打印错误,但是我花了太多时间才能找到它,因为该名称很长且很难看到该错误,所以我寻找其他原因。 现在看来如此明显..但是狗屎发生了:)

如果有这种情况,希望节省您的时间。

答案 6 :(得分:0)

对我来说,TableView单元格设置为静态内容而不是动态内容,因为我希望它根据我的集合生成X个单元格。一个很好的线索是,我在Xcode的层次结构概述面板中的表格视图单元格上方看到了一个奇怪的标题文本和一个蓝色立方体。

在此处可以将单元格设置为动态。 xcode screenshot showing dynamic selection