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
тип.