我在自定义单元类中使用某些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中重新定义任何现有的类方法的任何线索将是伟大的。提前谢谢。
答案 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"
}
}