Swift:tableview中的线程1 exc_bad_instruction(code = exc_i386_invop subcode = 0x0)

时间:2015-07-29 00:49:49

标签: ios swift uitableview

我正在使用Tableview控制器制作两个因

而崩溃的原型单元格
  

thread 1 exc_bad_instruction(code = exc_i386_invop subcode = 0x0)   指向>>>返回细胞!在第一个单元格中

     

致命错误:在解包可选值时意外发现nil

   override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return 10
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if (indexPath.section == 0) {
        let cell = tableView.dequeueReusableCellWithIdentifier("one", forIndexPath: indexPath) as? one
         cell?.textLabel?.text = "book"
        return cell!
    } else {

        let cell = tableView.dequeueReusableCellWithIdentifier("two", forIndexPath: indexPath) as! two

        cell.textLabel?.text = "not a book"
        return cell

    }

enter image description here

3 个答案:

答案 0 :(得分:2)

如果我可以改进代码:

 let cellID = (indexPath.section == 0) ? "one" : "two"
 if let cell = tableView.dequeueReusableCellWithIdentifier(cellID, forIndexPath: indexPath)
        as? UITableViewCell
     cell.textLabel!.text = (cellID == "one") ? "book" : "not a book"
     return cell
 } 
 else {
     assertionFailure("Unable to dequeue a cell of ID \(cellID)")
     return nil
 }

然后你会得到明智的错误行为。我敢打赌,即使您已将 onetwo命名为,您也忽略了设置其标识符&# 39;在每个单元原型的Attributes Inspector中的StoryBoard中。

您的回答非常错误。你不应该创建很多表格单元格。这是滥用表格。您应该只使用重用队列中的那些。

使用我的代码版本,并在if let cell之后设置断点。分析调试器中的对象,看看它到底是什么类型。

如果您点击assertionFailure,您仍然无法在StoryBoard中正确设置标识符。向我们展示一个屏幕截图来说服我们。

答案 1 :(得分:1)

看起来是因为电话

let cell = tableView.dequeueReusableCellWithIdentifier("two", forIndexPath: indexPath) as! two

正在对单元格进行强制向下转换以键入two,并且返回的对象不是two类型。在这里使用!基本上是这样说:

“将一个单元格出列(返回类型为AnyObject),然后向下传播两种类型two。我知道如果类型不匹配,向下转换可能会失败,但在这种情况下我肯定会失败。需要处理错误“

由于强制转换失败,强制转换返回一个可选项。在这种情况下,返回的单元格不能向下转换,因为类型不匹配。检查注册标识符"two"的代码,并检查您是否正在注册正确类型的类(名为two的UITableViewCell子类)

答案 2 :(得分:0)

我认为你应该编辑代码:

 override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return 2
    }