Using CustomStringConvertible in UITableView

I've declared the following:

class Song: CustomStringConvertible {
    let title: String
    let artist: String

    init(title: String, artist: String) {
        self.title = title
        self.artist = artist
    }

    var description: String {
        return "\(title) \(artist)"
    }
}

var songs = [
    Song(title: "Song Title 3", artist: "Song Author 3"),
    Song(title: "Song Title 2", artist: "Song Author 2"),
    Song(title: "Song Title 1", artist: "Song Author 1")
]

I want to enter this information into a UITableView, specifically at the tableView:cellForRowAtIndexPath:,

Такие как это:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell : LibrarySongTableViewCell! = tableView.dequeueReusableCell(withIdentifier: "Library Cell") as! LibrarySongTableViewCell

    cell.titleLabel = //the song title from the CustomStringConvertible[indexPath.row]
    cell.artistLabel = //the author title from the CustomStringConvertible[indexPath.row]
}

Как бы я это сделал? Я не могу понять это.

Большое спасибо!

2 ответа

Решение

Во-первых, ваш контроллер должен реализовать UITableViewDataSource. Затем,

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell : LibrarySongTableViewCell! = tableView.dequeueReusableCell(withIdentifier: "Library Cell") as! LibrarySongTableViewCell
    cell.titleLabel?.text = songs[indexPath.row].title
    cell.artistLabel?.text =songs[indexPath.row].artiste
}

Я думаю, что вы можете смешивать CustomStringConvertible с некоторыми другими шаблонами проектирования. Сначала ответ:

// You have some container class with your tableView methods
class YourTableViewControllerClass: UIViewController {

    // You should probably maintain your songs array in here, making it global is a little risky

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        var cell : LibrarySongTableViewCell! = tableView.dequeueReusableCell(withIdentifier: "Library Cell") as! LibrarySongTableViewCell

        // Get the song at the row
        let cellSong = songs[indexPath.row]

        // Use the song
        cell.titleLabel.text = cellSong.title
        cell.artistLabel.text = cellSong.artist
    }
}

Поскольку название ячейки / исполнитель уже являются общедоступными строками, вы можете просто использовать их по мере необходимости. CustomStringConvertible позволит вам использовать сам объект в качестве строки. Итак, в вашем случае вы могли бы иметь song и позвонить song.description и это напечатало бы "название художника". Но если вы хотите использовать песню title а также artistпросто позвони song.title а также song.artist, Вот документация по этому протоколу.

Кроме того, как я уже писал выше, попробуйте переместить songs массив в ваш ViewController. И, возможно, рассмотреть вопрос об использовании structс вместо classдля вашего Song тип.

Другие вопросы по тегам