iOS:dequeueReusableCell(withIdentifier:for :)和dequeueReusableCell(withIdentifier :)之间有什么区别?

时间:2017-05-27 06:37:33

标签: ios uitableview

根据官方文档,有两种方法可以从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的单元格将被最后一行返回的单元格替换? 感谢。

4 个答案:

答案 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检查。