如何为UITableViewCell创建协议?

时间:2018-04-25 04:05:11

标签: swift

我有几个UITableViewCell有几个不同的布局,取决于他们是队友,敌人等等。但我必须以不同的方式对待每种类型等等。所以我试图减少复制代码使用协议,

我为UITableViewCell创建了一个协议,如下所示:

protocol ViewCellProtocol {
    var teamRank: UILabel! { get set }
    var ranking: UILabel! { get set }
    var rankDelta: UILabel! { get set }
    var upDownIndicator: UILabel! { get set }
    var textLabel : UILabel? { get }
}

这是我的班级:

import UIKit

class TeamStatsTableViewCell: UITableViewCell {

    @IBOutlet weak var teamRank: UILabel!
    @IBOutlet weak var ranking: UILabel!
    @IBOutlet weak var rankDelta: UILabel!
    @IBOutlet weak var upDownIndicator: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

然后当我尝试使用它时

 func playerViewCell(_ tableView: UITableView, indexPath: IndexPath) -> ViewCellProtocol {
        let cell = tableView.dequeueReusableCell(withIdentifier: "teamNameCell")! as! TeamStatsTableViewCell
        let rank = sections[indexPath.section].data[indexPath.row]["rank"] as? Int
        let (rating, ratingDelta) = selectRating(section: indexPath.section, row: indexPath.row)
        let indicator = decideRatingIndicator(ratingDelta: ratingDelta, cell: cell)
        cell.upDownIndicator?.text = "\(indicator)"
        cell.teamRank?.text = "#\(rank!)"
        cell.ranking?.text = String(rating)
        cell.rankDelta.text = String(format: "%.0f", ratingDelta)
        cell.textLabel?.text = sections[indexPath.section].data[indexPath.row]["username"] as? String
        return cell as! ViewCellProtocol
    }

我收到错误:

  

无法将'.TeamStatsTableViewCell'(0x1008d35d8)类型的值转换为'.ViewCellProtocol'(0x10ea37db8)。   2018-04-24 22:00:27.137516-0600 [434:72294]无法将'.TeamStatsTableViewCell'(0x1008d35d8)类型的值转换为'.ViewCellProtocol'(0x10ea37db8)。

我希望它会告诉我它不符合哪一部分。有什么建议?在Go中快速查看protocols之类的interface{}相当新鲜。感谢。

2 个答案:

答案 0 :(得分:1)

您的自定义单元格类可能正在实现协议中的所有内容,并且在objC中已经足够了,但是在这里您必须声明您明确地实现了该协议

class TeamStatsTableViewCell: UITableViewCell, ViewCellProtocol {

    @IBOutlet weak var teamRank: UILabel!
    @IBOutlet weak var ranking: UILabel!
    @IBOutlet weak var rankDelta: UILabel!
    @IBOutlet weak var upDownIndicator: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }
}

答案 1 :(得分:0)

您需要声明TeamStatsTableViewCell符合ViewCellProtocol,例如添加此扩展程序:

extension TeamStatsTableViewCell: ViewCellProtocol { }