1

我已经声明了以下内容:

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]
}

我该怎么做?我想不通。

非常感谢!

4

2 回答 2

0

首先,你的 Controller 必须实现 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
}
于 2017-07-02T15:07:39.010 回答
0

我认为您可能将 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,它会打印出“标题艺术家”。但是如果你想使用歌曲的titleand artist,你应该只调用song.titleand song.artist这是关于该协议的文档。

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

于 2017-07-02T13:11:14.130 回答