一尘不染

Swift中的UITableView

swift

我正在努力弄清楚此代码段出了什么问题。目前这在Objective-
C中有效,但是在Swift中这只是在方法的第一行崩溃。它在控制台日志中显示错误消息:Bad_Instruction

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!  {
        var cell : UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell

        if (cell == nil) {
            cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell")
        }

        cell.textLabel.text = "TEXT"
        cell.detailTextLabel.text = "DETAIL TEXT"

        return cell
    }

阅读 178

收藏
2020-07-07

共1个答案

一尘不染

另请参阅马特的答案,其中包含解决方案的后半部分

让我们找到一个无需创建自定义子类或笔尖的解决方案

真正的问题在于,Swift区分可以为空(nil)的对象和不能为空的对象。如果您没有为标识符注册笔尖,则dequeueReusableCellWithIdentifier可以返回nil

这意味着我们必须将变量声明为可选的:

var cell : UITableViewCell?

而且我们必须使用as?notas

//variable type is inferred
var cell = tableView.dequeueReusableCellWithIdentifier("CELL") as? UITableViewCell

if cell == nil {
    cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "CELL")
}

// we know that cell is not empty now so we use ! to force unwrapping but you could also define cell as
// let cell = (tableView.dequeue... as? UITableViewCell) ?? UITableViewCell(style: ...)

cell!.textLabel.text = "Baking Soda"
cell!.detailTextLabel.text = "1/2 cup"

cell!.textLabel.text = "Hello World"

return cell
2020-07-07