想要在Swift中重新定义willDisplayCell方法。如何重新定义类方法

时间:2016-06-06 08:50:21

标签: ios swift uitableview oop

我在自定义单元类中使用某些UI组件,我想在willDisplayCell方法中配置它们。原始定义是

public func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)

现在使用cell.myTextField.text = "customise" 发出错误,单元格没有任何组件作为myTextField

要解决此问题,我必须将方法重新定义为

public func tableView(tableView: UITableView, willDisplayCell cell: **myCustomCellClass**, forRowAtIndexPath indexPath: NSIndexPath)

如何做到这一点以及随后如何在swift中重新定义任何现有的类方法的任何线索将是伟大的。提前谢谢。

3 个答案:

答案 0 :(得分:4)

您需要将单元格转换为函数内的类型

public func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)
{
    if let myCell = cell as? **myCustomCellClass**
    {
        //perform your code to cell
    }
}

答案 1 :(得分:4)

不幸的是,您无法更改参数类型,因为这会更改界面。您可以将方法的返回类型更改为子类型,但不能将方法参数更改为子类型。

你真的有一个选项,一个动态演员:

public func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
   // use as? or as! to cast UITableViewCell to your desired type
}

当然,您可以通过多种方式执行相同操作,例如,您可以创建重定向方法:

public func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
   self.tableView(tableView, willDisplayMyCell: cell as! MyCellClass, forRowAtIndexPath: indexPath)
}

private func tableView(tableView: UITableView, willDisplayMyCell myCell: MyCellClass, forRowAtIndexPath indexPath: NSIndexPath) {
   // do something
}

您可以将其抽象为UITableViewDelegate

的子协议
class MyTableViewCell : UITableViewCell {

}

protocol MyTableViewDelegate : UITableViewDelegate {
    associatedtype CellClass: UITableViewCell

    func tableView(
        tableView: UITableView,
        willDisplayMyCell cell: CellClass,
        forRowAtIndexPath indexPath: NSIndexPath)
    }

extension MyTableViewDelegate {
    func tableView(
        tableView: UITableView,
        willDisplayCell cell: UITableViewCell,
        forRowAtIndexPath indexPath: NSIndexPath) {

        self.tableView(tableView, willDisplayMyCell: cell as! CellClass, forRowAtIndexPath: indexPath)
    }    
}

关于这一点的一个很酷的事情是该协议是可重用的,但是,它归结为as?as!动态转换。

答案 2 :(得分:1)

UITableViewCell类型的单元格添加到您的单元格类型

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    if let aCell = cell as? YourCellClass {
        aCell.myTextField.text = "customise"
    }
}