我正在使用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
}
答案 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
}
然后你会得到明智的错误行为。我敢打赌,即使您已将类 one
和two
命名为,您也忽略了设置其标识符&# 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
}