启动应用程序xCode时EXC_BAD_INSTRUCTION断点

时间:2014-07-12 23:13:29

标签: uitableview swift

我的应用程序中有一个tableview,当我启动应用程序时,它崩溃了以下功能。

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    // Configure the cell...
    let cellId: NSString = "Cell"
    var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(cellId) as UITableViewCell
}

它在var cell

的行上崩溃了

它给出以下错误: error

我无法弄清楚我的代码有什么问题。

整个功能:

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    // Configure the cell...
    let cellId: NSString = "Cell"
    var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(cellId) as UITableViewCell

    let data: NSManagedObject = mylist[ip.row] as NSManagedObject

    cell.textLabel.text = data.valueForKeyPath("voornaam") as String
    cell.detailTextLabel.text = data.valueForKeyPath("achternaam") as String
    return cell
}

修改: 我现在得到的:(仍然给出相同的错误)

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell? {
    // Configure the cell...
    let cellId: NSString = "Cell"
    var cell: UITableViewCell? = tableView?.dequeueReusableCellWithIdentifier(cellId) as? UITableViewCell

    if cell == nil {
        cell = UITableViewCell(style: .Subtitle, reuseIdentifier: cellId)
    }

    let data: NSManagedObject = mylist[indexPath.row] as NSManagedObject

    cell!.textLabel.text = data.valueForKey("voornaam") as String
    cell!.detailTextLabel.text = data.valueForKey("achternaam") as String
    //cell!.textLabel.text = "Hoi"
    return cell
}

4 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为as运算符被定义为将对象强制转换为给定类型,并在转换失败时崩溃。在这种情况下,第一次调用时dequeue的调用会返回nil。您需要使用as?运算符,它将尝试将给定对象强制转换为类型,并返回仅在转换成功时才具有值的可选项:

var cell: UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellId) as? UITableViewCell

if cell == nil {
  cell = UITableViewCell(style: .Subtitle, reuseIdentifier: cellId)
}

...

由于cell现在是一个可选值,因此当您想调用其上的方法强制解包其中的cell!时,请使用UITableViewCell

此外,您的代码还有第二个问题:它从未创建过新的单元格。 dequeue会在您第一次在桌面视图中调用时返回nil。您需要在我的代码示例中实例化一个新的UITableViewCell,然后从cellFor...方法返回它。然后,表格视图将保存单元格并在将来调用dequeue时将其返回。

答案 1 :(得分:0)

首先,为什么要在if let ip = indexPath行上进行可选绑定?此参数不是可选的,您不需要执行可选绑定或解包。但这不应该导致代码崩溃。

删除您的let data行并为您的单元格指定文字字符串,看它是否仍然崩溃。

答案 2 :(得分:0)

我建议你检查一下你是否设置了tableview的代表?在设置其他所有内容的过程中,我犯了一次错误。

答案 3 :(得分:0)

也许为时已晚,但我想分享一下我的经验。我有一个类似的错误,因为我从另一个项目复制了整个代码。所以我认为变量和函数不会被识别,所以我不得不拖动它们(cntr + drag)然后它就解决了。 对不起,如果我无法解释得更好。我是新来的。