在 UITableView 中使用 CustomStringConvertible
Using CustomStringConvertible in UITableView
我声明如下:
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]
}
我该怎么做?想不通了。
非常感谢!
我认为您可能将 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
}
}
因为单元格的 title/artist 已经是 public 字符串,所以您可以根据需要使用它们。 CustomStringConvertible 将允许您将实际对象本身用作字符串。所以,在你的情况下,你可以有一个 song
并调用 song.description
,它会打印出 "title artist"。但是如果你想使用歌曲的title
和artist
,你应该只调用song.title
和song.artist
。 Here's the documentation on that protocol.
此外,正如我上面所写,尝试将您的 songs
数组移动到您的 ViewController 中。也许考虑使用 struct
s 而不是 class
s 作为你的 Song
类型。
首先,您的控制器必须实现 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
}
我声明如下:
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]
}
我该怎么做?想不通了。
非常感谢!
我认为您可能将 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
}
}
因为单元格的 title/artist 已经是 public 字符串,所以您可以根据需要使用它们。 CustomStringConvertible 将允许您将实际对象本身用作字符串。所以,在你的情况下,你可以有一个 song
并调用 song.description
,它会打印出 "title artist"。但是如果你想使用歌曲的title
和artist
,你应该只调用song.title
和song.artist
。 Here's the documentation on that protocol.
此外,正如我上面所写,尝试将您的 songs
数组移动到您的 ViewController 中。也许考虑使用 struct
s 而不是 class
s 作为你的 Song
类型。
首先,您的控制器必须实现 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
}