Как я могу создать протокол для UITableViewCell? - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть несколько 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).

Хотелось бы, чтобы он сказал мне, к какой части он не соответствует. Какие-либо предложения? Совершенно новый взгляд на protocols, как interface{} в Go. Спасибо.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Ваш пользовательский класс ячеек может реализовывать все, что есть в протоколе, и этого может быть достаточно в 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
    }
}
0 голосов
/ 25 апреля 2018

Вам необходимо объявить, что TeamStatsTableViewCell соответствует ViewCellProtocol, например, добавив это расширение:

extension TeamStatsTableViewCell: ViewCellProtocol { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...