使用重用标识符调用 super.tableView(tableView: UITableView, cellForRowAtIndexPath...

Posted

技术标签:

【中文标题】使用重用标识符调用 super.tableView(tableView: UITableView, cellForRowAtIndexPath...【英文标题】:Calling super.tableView(tableView: UITableView, cellForRowAtIndexPath... with reuseIdentifier 【发布时间】:2016-01-17 02:36:27 【问题描述】:

首先,我想指出我想要进行普通调用的原因,当可重用单元在基类中出列时,这是因为这行代码你很快就会在我的问题中再次看到:

cell.backgroundColor = cell.contentView.backgroundColor; 

这是针对 iPad 的错误修复,不尊重我设置的 UITableView.backgroundColor = myCustomColor 和 UITableViewCell.backgroundColor = clearColor。 iPad 显示白色,iPhone 版本一切正常,你可以看到这个错误here,每次单元格出列时我都必须再次设置背景颜色,这是唯一适合我的解决方案。我试图在我的基类中这样做一次,并提出一个解决方案,我不必记住为每个子类调用一个 func(可能不可能)。

我有几个自定义的UITableViewControllers 类,我们称它们为ATableViewControllerBTableViewController,它们继承自一个名为UIBaseDashboardTableViewController 的基类,该基类继承自UITableViewController

我正在生成动态原型表单元格并在ATableViewControllerBTableViewController 中使用以下函数:

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("ATableViewCellId", forIndexPath: indexPath)

        //common setting to fix always white background in iPad bug
        cell.backgroundColor = cell.contentView.backgroundColor;
        return cell
    

对于ATableViewControllerBTableViewController,TableViewCell Id ACustomTableCellId 是唯一的或不同的。我的所有UITableViewControllers 都有一个通用设置,这些设置继承自我的基类UIBaseDashboardTableViewController。你可以看到上面代码的 backgroundColor 行是我的常用设置,在UIBaseDashboardTableViewController 的所有子类中都是相同的。在每个子类中,我首先尝试执行以下操作:

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    super.tableView(tableView: tableView, cellForRowAtIndexPath: indexPath)
    ...

但这行不通,我需要ReusableCellIndentifer

我目前的解决方案可能真的很好,如下所示,在我的子类中,我有以下内容:

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let data = dataArray[indexPath.row]
        let dequeuedCell = tableView.dequeueReusableCellWithIdentifier("BTableViewCellID", forIndexPath: indexPath)
        let cell = dequeuedCell as! MyCustomTableViewCell
        // Configure the cell...
        cell.model = data

        //call common settings for cells function in base class
        super.setDequeueReusableCellCommon(cell)

        return cell
    

然后在我的基类UIBaseDashboardTableViewController 中实现:

func setDequeueReusableCellCommon(cell: UITableViewCell) 
        cell.backgroundColor = cell.contentView.backgroundColor
    

唯一的缺点是我必须记住在我所有的子班级中都打电话给super.v setDequeueReusableCellCommon

关于如何解决这个问题有更好的建议吗?

【问题讨论】:

拥有相同的背景似乎过于复杂。你不想继承 UITableViewCell 的子类,因为共享的继承属性在那个对象而不是 UITableView 上? 它修复了 iPad 显示白色背景而不是我为 UITableView 背景颜色设置的颜色 【参考方案1】:

您正在更改单元格的背景颜色,但对 tableViews 进行了继承。对 tableViewCell 使用继承,而不是整个 tableView。在awakeFromNib 方法中的tableViewCell 设置self.backgroundColor = self.contentView.backgroundColor 的根类中。

【讨论】:

这很明显,哈哈,我想是时候结束了,谢谢!

以上是关于使用重用标识符调用 super.tableView(tableView: UITableView, cellForRowAtIndexPath...的主要内容,如果未能解决你的问题,请参考以下文章

根据部分更改单元重用标识符

如何使用动态重用标识符设置和出列自定义 UITableViewCell?

iOS:未使用重用标识符清除单元格内容

面试阙表视图重用标识符内部工作

nib 中的单元重用标识符与标识符不匹配

iPhone sdk UITableView 单元重用标识符