在UITableView中使用CustomStringConvertible



我已经声明了以下内容:

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")
]

我想将此信息输入到UITableView中,特别是在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]
}

我该怎么做?我想不通。

多谢!

首先,控制器必须实现 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,它会打印出"标题艺术家"。但是如果你想使用歌曲的titleartist,你应该打电话给song.titlesong.artist。这是有关该协议的文档。

另外,正如我上面写的,尝试将songs数组移动到ViewController中。也许可以考虑使用struct而不是classs作为您的Song类型。

相关内容

  • 没有找到相关文章

最新更新