我不知道怎么说这个但是我正在创建一个音乐应用程序,我有一个流派选项卡按钮,它将类型列为UICollectionView
中的单元格。
在这个例子中,它是一张专辑"观看王座"那首专辑中有一首歌。但现在如果我回到我的流派集合视图并选择" Hip Hop / Rap"并选择" Jay-Z和Kanye West" (这张专辑中的一些歌曲在这一类型下展示,另一首在另一首下面),然后查看专辑(再次只有1张 - "观看宝座"),它只显示一首曲目,而不是15张。
这两种方式都有效。如果我通过" Hip Hop / Rap"选择了专辑。类型首先,如果我选择" Hip-Hop"该专辑将显示两种类型的15首歌曲。类型,专辑显示两首歌。不知何故,该表存储了第一个单击类型的数据。我有一组图像来说明我的意思,但我必须有10个代表发布图像...
以下是相关代码:
class AlbumsInGenreTableViewController: UITableViewController {
var allAlbums : [MPMediaItemCollection] = []
var selectedGenre : NSString!
var selectedArtist : NSString!
let defaultArtwork = UIImage(named: "No-artwork-albums")
var numberOfSongs : [Int] = []
var albumCount = 0
override func viewDidLoad() {
super.viewDidLoad()
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
var albumsQuery = MPMediaQuery.songsQuery()
var artistPredicate = MPMediaPropertyPredicate(value: self.selectedArtist, forProperty: MPMediaItemPropertyAlbumArtist, comparisonType: .EqualTo)
var genrePredicate = MPMediaPropertyPredicate(value: self.selectedGenre, forProperty: MPMediaItemPropertyGenre, comparisonType: .EqualTo)
albumsQuery.addFilterPredicate(artistPredicate)
albumsQuery.addFilterPredicate(genrePredicate)
albumsQuery.groupingType = MPMediaGrouping.Album
self.allAlbums = []
self.allAlbums += albumsQuery.collections as [MPMediaItemCollection]
var label = UILabel(frame: CGRectMake(10.0, 0.0, 50.0, 40.0))
label.backgroundColor = UIColor.clearColor()
label.font = UIFont.boldSystemFontOfSize(14.0)
let albumsArtist = self.selectedArtist as NSString
let albumArtistName = albumsArtist.substringToIndex(min(25, albumsArtist.length))
self.albumCount = self.allAlbums.count
for album in self.allAlbums{
self.numberOfSongs.append(album.count)
}
... more irrelevant code
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("albumCell", forIndexPath: indexPath) as AlbumsInGenreTableViewCell
var rowItem = self.allAlbums[indexPath.row].representativeItem
cell.albumName.text = "\(rowItem.valueForProperty(MPMediaItemPropertyAlbumTitle) as NSString)"
var trackCount : AnyObject? = numberOfSongs[indexPath.row]
if(trackCount != nil){
cell.albumDetail.text = "\(self.numberOfSongs[indexPath.row]) tracks"
}
... more code
return cell
}
班级顶部的数据是从上一个ViewController
传递的:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "albumsInGenre"{
let albumsVC = segue.destinationViewController as AlbumsInGenreTableViewController
var selectedIndex = self.tableView.indexPathForCell(sender as UITableViewCell)!.row
var selectedItem = self.allArtists[selectedIndex].representativeItem
var artistsName = selectedItem.valueForProperty(MPMediaItemPropertyAlbumArtist) as NSString
albumsVC.selectedGenre = self.selectedGenre as NSString
albumsVC.selectedArtist = artistsName as NSString
}
}
我尝试在self.tableView.reloadData()
中使用viewWillAppear()
,但这也不起作用。在其他类型选择上,视图显示正确的数据 -
只有当一个专辑在多个类型中分割时,该表才决定保留所选择的第一个专辑。我希望我能够很好地解释我的问题。
谢谢!
编辑: 链接到图像! http://imgur.com/a/yG2Jm
编辑2: 我试图覆盖prepareForReuse方法:
class AlbumsInGenreTableViewCell: UITableViewCell {
@IBOutlet var albumArt: UIImageView!
@IBOutlet var albumName: UILabel!
@IBOutlet var albumDetail: UILabel!
override func prepareForReuse() {
super.prepareForReuse()
self.albumDetail.text = nil
self.albumName.text = nil
self.albumArt.image = nil
}
}
遗憾的是仍然收到相同的结果
编辑3:
在prepareForReuse()方法不起作用之后,我被引导相信视图在彼此之间发送不正确的数据(类型)。然后我将标题设置为专辑视图,因为它是从前一个视图控制器收到的类型,但即使这样也没关系。然后我尝试实现viewWillAppear()并在这里重新编写mediaQuery,并在视图首次加载时从数组中删除所有值。不幸的是,这一切都没有奏效。我真的看不出我哪里出错了。我也尝试在viewWillAppear()中重新加载数据无济于事。我的下一次尝试是从前一个视图控制器返回整个numberOfSongs数组。我有一种感觉,即使这有效,当我真正去列出专辑中的歌曲时,我会遇到同样的问题。
编辑4 - 这是一个iOS错误:
这个BUG也存在于股票音乐应用程序中!我应该在不久前检查过这个,但完全相同的事情发生在股票音乐应用程序中!这就是你可以复制错误的方法:
答案 0 :(得分:1)
细胞被重复使用。当你得到一个单元格时,不要认为它是空白的。例如,在此代码中:
if(trackCount != nil){
cell.albumDetail.text = "\(self.numberOfSongs[indexPath.row]) tracks"
}
可能已经设置了文本。您应该添加else
块以将文本设置为其默认状态。
您还可以将单元格重置为prepareForReuse
中的默认状态。
答案 1 :(得分:1)
原来这是一个iOS错误 - 以下是你可以在股票音乐应用程序中复制它的方法:
将相册分为两种类型(进入iTunes,从单张专辑中选择X种歌曲,并将类型更改为" XXXXXX"然后从专辑中设置剩余的N首歌曲对于类型" NNNNNNN" - 将NNNNNNN'和#XXXXXX'替换为您选择的类型。)然后同步您的设备。
进入股票音乐应用程序并转到流派,选择' XXXXXX'然后是专辑的类型,你会看到X个歌曲。
现在返回并选择' NNNNNNN'专辑后面的类型,你仍然可以看到X号歌曲而不是你期待的N首歌曲。
我还向Apple提交了这个错误,所以希望它可以在未来的更新中修补。