根据官方文档,有两种方法可以从tableView的队列中获取可重用的单元格。一个是dequeueReusableCell(withIdentifier:for:)
,另一个是dequeueReusableCell(withIdentifier:)
。假设从文档的解释,我认为前者是返回可重用单元格并将其添加到tableView
的方法。另一方面,后者是仅返回可重用单元的方法。
这是对的吗?
如果是对的,我还有另一个问题。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: UITableViewCell = self.tableView.dequeueReusableCell(with: SomeTableViewCell.self, for: indexPath)
let anotherCell: UITableViewCell = self.tableView.dequeueReusableCell(with: AnotherTableViewCell.self)
return anotherCell
}
在第一行,我们可以获取可重复使用的单元格,并将cell
添加到tableView
。在第二个,我们只获得另一个可重复使用的单元格。最后,该方法返回从第二行获得的单元格。返回的单元格与已添加到tableView的单元格不同。
在这种情况下,第一行添加到tableView的单元格将被最后一行返回的单元格替换?
感谢。
答案 0 :(得分:5)
方法dequeueReusableCell(withIdentifier:)
早于dequeueReusableCell(withIdentifier:for:)
,它们之间的主要区别在于,如果单元格未注册,则第一个将返回nil,第二个将返回异常,并且应用程序会崩溃。 IndexPath需要进行高度计算(如果已定义tableView:heightForRowAtIndexPath
)
答案 1 :(得分:1)
看了the official documentation后,我意识到你的解释有点正确。
请你看一下this的答案,因为这可能会带来更多的清晰度。
答案 2 :(得分:0)
dequeueReusableCell(withIdentifier:)
和dequeueReusableCell(withIdentifier:for:)
两者都返回单元格,但旧方法返回 nil ,而最新方法会崩溃该应用。
旧版本可能支持 iOS 5 ,而较新的方法支持 iOS 6 和上方
答案 3 :(得分:0)
如果你将使用下面的方法,你总是得到初始化的实例,它将始终是该索引路径的正确大小,因此你将能够在内容视图内做布局,知道大小是正确的。因为这将在返回之前设置单元格大小,这就是我们需要添加indexPath
的原因。
let cell: UITableViewCell = self.tableView.dequeueReusableCell(with:
"Cell", for: indexPath)
在下面的情况下,您必须检查单元格是否为零,请自行配置。
var cell:UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: "Cell")
if (cell == nil) {
cell = UITableViewCell(style:UITableViewCellStyle.subtitle, reuseIdentifier:"Cell")
}
注意:在较新的版本中,如果您没有为标识符注册类/ nib,则self.tableView.dequeueReusableCell(with:
"Cell", for: indexPath)
应用程序崩溃。在旧版本中,tableView.dequeueReusableCell(withIdentifier: "Cell")
版本在这种情况下返回nil。此外,如果您使用的是storyboard
,则无需担心注册该单元格。
dequeueReusableCellWithIdentifier:forIndexPath:
将始终返回一个单元格。另一方面,如果没有可重复使用的单元格,那么dequeueReusableCellWithIdentifier:
将返回nil,这就是为什么需要nil检查。