如果我取消注释
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的正确方法是什么?
答案 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
}