如何在Swift中使用dequeueReusableCellWithIdentifier?

时间:2014-06-28 23:50:23

标签: ios uitableview swift

如果我取消注释

tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?)

我在行

上收到错误
let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)

表示UITableView? does not have a member named 'dequeueReusableCellWithIdentifier'

如果我打开tableview然后错误消失了,但是在Objective-C中我们通常会检查单元格是否存在,如果不存在,我们会创建一个新单元格。在Swift中,由于提供的样板文件使用了let关键字并解开了一个可选项,因此如果它是零,我们就无法重新分配。

在Swift中使用dequeueReusableCellWithIdentifier的正确方法是什么?

5 个答案:

答案 0 :(得分:37)

您可以隐式地将参数展开到方法中,并将dequeueReusableCellWithIdentifier的结果转换为以下简洁代码:

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

    //configure your cell

    return cell
}

答案 1 :(得分:26)

如果在加载表之前没有在表视图中注册单元格类型,则可以使用以下方法获取单元格实例:

private let cellReuseIdentifier: String = "yourCellReuseIdentifier"

// MARK: UITableViewDataSource

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
  var cell:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellReuseIdentifier)
  if (cell == nil) {
    cell = UITableViewCell(style:UITableViewCellStyle.Subtitle, reuseIdentifier:cellReuseIdentifier)
  }
  cell!.textLabel!.text = "Hello World"
  return cell!
}

答案 2 :(得分:5)

您需要打开tableView变量,因为它是可选的

if let realTableView = tableView {
    let cell = realTableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)
    // etc
} else {
    // tableView was nil
}

或者你可以通过

来缩短它
tableView?.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)

在回答有关Objective-C中的问题时,我们通常会检查单元格是否存在,如果不存在,我们会创建一个新单元格,dequeueReusableCellWithIdentifier始终返回单元格(只要您已为此标识符注册了类或笔尖),因此您无需创建新标识符。

答案 3 :(得分:3)

在Swift 3和Swift 4版本中,您只需使用

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CellIdentifier", for: indexPath as IndexPath) as UITableViewCell
        cell.textLabel?.text = "cell number \(indexPath.row)."

        //cell code here

        return cell
    }

在Swift 2版本中

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

 cell.textLabel?.text = "cell number \(indexPath.row)."

        //cell code here

        return cell
    }

答案 4 :(得分:2)

swift 3版本:

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath!) -> UITableViewCell {
      let cell = tableView.dequeueReusableCell(withIdentifier:"CellIdentifier", for: indexPath) as UITableViewCell
      return cell
    }