我从文档文件夹中获取数据。我有几个UITableViewController
。当我从艺术家UITableViewController
移动到歌曲UITableViewController
时,我希望仅显示特定艺术家的歌曲。我做了但是我得到了一些空行。我认为,因为我计算所有的mp3文件数组。如何计算包含特定艺术家的文件?
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// #warning Potentially incomplete method implementation.
// Return the number of sections.
return 1 ?? 0
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete method implementation.
// Return the number of rows in the section.
return contentArray.count ?? 0
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("artistTwo", forIndexPath: indexPath) as! SongsCellArtist
var data = contentArray[indexPath.row]
var documentFolder = fileManager.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)
var urlForPlayer: NSURL!
if var urlFromFolder: NSURL = documentFolder.first as? NSURL {
urlForPlayer = urlFromFolder.URLByAppendingPathComponent(data)
}
println(urlForPlayer)
var player = AVPlayerItem(URL: urlForPlayer)
var nameSong: String!
var nameAlbum: String!
var nameArtistForCell: String!
var dataForImage: NSData!
var commonMetaData = player.asset.commonMetadata as! [AVMetadataItem]
for item in commonMetaData {
if item.commonKey == "title" {
nameSong = item.stringValue
}
if item.commonKey == "album" {
nameAlbum = item.stringValue
}
if item.commonKey == "artist" {
nameArtistForCell = item.stringValue
}
if item.commonKey == "artwork" {
dataForImage = item.dataValue
}
}
var arrayFromCell: [String]!
if nameArtistForCell == nameArtist {
cell.nameSong?.text = nameSong
if nameAlbum != nil {
cell.artistAlbumName?.text = "\(nameArtistForCell) - \(nameAlbum)"
} else {
cell.artistAlbumName?.text = "\(nameArtistForCell)"
}
if dataForImage != nil {
cell.imageSongs?.image = UIImage(data: dataForImage)
}
}
return cell
}
答案 0 :(得分:1)
如果您的内容未填满屏幕,则会在TableView
的末尾显示空行的默认行为。要删除这些空行,请在viewDidLoad
调用中执行以下操作:
tableView.tableFooterView = UIView(frame: CGRectZero)
要过滤Array
项目,确实有内容,我建议您使用filter
方法。 Array
的示例仅包含Strings
:
let filteredArray = contentArray.filter { data in
var data = contentArray[indexPath.row]
var documentFolder = fileManager.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)
var urlForPlayer: NSURL!
if var urlFromFolder: NSURL = documentFolder.first as? NSURL {
urlForPlayer = urlFromFolder.URLByAppendingPathComponent(data)
}
println(urlForPlayer)
var player = AVPlayerItem(URL: urlForPlayer)
var nameSong: String!
var nameAlbum: String!
var nameArtistForCell: String!
var dataForImage: NSData!
var commonMetaData = player.asset.commonMetadata as! [AVMetadataItem]
for item in commonMetaData {
if item.commonKey == "title" {
nameSong = item.stringValue
}
if item.commonKey == "album" {
nameAlbum = item.stringValue
}
if item.commonKey == "artist" {
nameArtistForCell = item.stringValue
}
if item.commonKey == "artwork" {
dataForImage = item.dataValue
}
}
// only add this to my new array, if I have all available meta data information
return nameSong != nil && nameAlbum && nil && nameArtistForcell != nil && dataForImage && nil
}
您可以详细了解关闭表达式 in the Docs。
答案 1 :(得分:0)
你不应该在cellForRowAtIndexPath
内完成所有这些工作。在表视图中显示任何内容之前,创建一个执行查找和过滤的函数。该函数应该创建一个非常简单的数组,其中的每个对象都匹配您真正想要显示的单元格。
此时,numberOfRowsInSection
返回该数组的计数,cellForRowAtIndexPath
仅需要查找所请求行的对象并提取所需的各个字符串显示。所有其他决定都已经做出。
答案 2 :(得分:0)
函数tableView(tableView: UITableView, numberOfRowsInSection section: Int)
返回contentArray.count
,表示所有艺术家的所有歌曲。
但函数tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
显示特定艺术家的元数据。因此,tableview上有空行。
最好在viewDidLoad
函数中过滤特定艺术家的歌曲,并将它们放到songOfArtistArray
(例如)。
因此,函数tableView(tableView: UITableView, numberOfRowsInSection section: Int)
应返回songOfArtistArray.count
。