我的应用程序中有一个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
它给出以下错误:
我无法弄清楚我的代码有什么问题。
整个功能:
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
}
答案 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)然后它就解决了。 对不起,如果我无法解释得更好。我是新来的。