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

问题描述:

根据官方文档,有两种方法从tableView的队列中获取可重用单元。一个是dequeueReusableCell(withIdentifier:for:),另一个是dequeueReusableCell(withIdentifier:)。假设从文档的解释中,我认为前者是返回可重用单元格的方法,并将其添加到tableView。另一方面,后者是刚刚返回可重用单元的方法。 这是正确的吗?iOS:dequeueReusableCell(withIdentifier:for :)和dequeueReusableCell(withIdentifier :)之间有什么区别?

如果是对的,我还有一个问题。

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 
} 

在第一线,我们就可以得到可重复使用的电池,并添加celltableView。而在第二个,我们只是获得另一个可重用的单元格。最后,该方法返回从第二行获取的单元格。返回的单元格与已添加到tableView的单元格不同。 在这种情况下,在第一行添加到tableView的单元格刚好在最后一行被返回的单元格替换? 谢谢。

+4

的可能的复制[当使用dequeueReusableCellWithIdentifier VS dequeueReusableCellWithIdentifier:forIndexPath(https://*.com/questions/25826383/when-to-use-dequeuereusablecellwithidentifier-vs-dequeuereusablecellwithidentifi) –

+0

您可以从这个参考答案 - https://*.com/a/25835438/5237727 –

+0

你见过文档的解释吗?你展示的答案可以是答案。但是,它不包括这个问题。我将重点放在解释上,即只返回单元格而另一个返回单元格并将其添加到表格视图中。我想问我的解释是否正确。 –

看过the official documentation之后,我意识到您的解释有些不正确。

您能否看看this答案,因为这可能会带来更多的清晰度。

+0

您能否看到https://developer.apple.com/reference/uikit/uitableview/1614878-dequeuereusablecell?解释似乎与您的答案相矛盾,因为您说获取的单元格从未添加到表格视图中,并且该文档表示返回该单元格并将其添加到表格视图中。 –

+0

@Kazuya Tomita:请检查我的最新答案。 –

+0

如果答案有帮助,也可以upvote。谢谢 –

方法dequeueReusableCell(withIdentifier:)大于dequeueReusableCell(withIdentifier:for:),它们之间的主要区别是,如果单元格没有注册,第一个将返回nil,第二个将抛出异常,并且应用程序将崩溃。 IndexPath需要进行身高计算(如果定义为tableView:heightForRowAtIndexPath

+0

谢谢,文档中提到“为指定的重用标识符返回一个可重用的表视图单元对象并将其添加到表中”,作为“dequeueReusableCell(withIdentifier:for :)”的解释。你怎么看待这件事? –

+0

这意味着如果未创建此类型单元格,或者表视图没有足够的此单元格实例,它将创建它,否则它将返回已创建的实例以供重用。 –

+0

我可以逐渐理解,但是“返回一个指定的重用标识符的可重复使用的表视图单元对象并将其添加到表”中的“表”?是不是桌子视图? –

dequeueReusableCell(withIdentifier:)dequeueReusableCell(withIdentifier:for:)

两个返回细胞,但旧的方法返回而最新方法崩溃的应用程序。

年长

可支持高达的iOS 5而新方法的支持的iOS 6以上

如果你会使用以下方法,你总是初始化实例,它总是会为大小合适indexpath,因此您可以在contentview中进行布局,以了解大小是否正确。因为这会在返回之前设置单元格大小,这就是为什么我们需要添加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") 
    } 

注:在较新的版本,如果即self.tableView.dequeueReusableCell(with: "Cell", for: indexPath)应用程序崩溃,你没有注册的标识类/笔尖。在旧版本中,即tableView.dequeueReusableCell(withIdentifier: "Cell")版本在这种情况下返回零。此外,如果您使用storyboard,则无需担心注册单元。

dequeueReusableCellWithIdentifier:forIndexPath:将始终返回一个单元格。另一方面,dequeueReusableCellWithIdentifier:将返回零,如果没有可重用的单元这就是为什么零检查是必需的。