如何计算包含特定艺术家的文件?

时间:2015-08-01 13:23:44

标签: ios swift uitableview

我从文档文件夹中获取数据。我有几个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
}

enter image description here

3 个答案:

答案 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