tableview加载一些旧数据-BUG IN STOCK iOS音乐应用程序



不知道该怎么说,但我正在创建一个音乐应用程序,我有一个流派选项卡按钮,它将流派列为UICollectionView中的Cells。

然后,用户选择一个流派,比如"嘻哈",并显示相应的艺术家,例如"Jay-Z,Kanye West,Kendrick Lamar…"等。如果用户选择"Jay-Z和Kanye West",则显示应用了流派谓词的艺术家专辑。

在这个例子中,它是一张专辑"观看王座"和专辑中的一首歌。但现在,如果我回到我的流派收藏视图,选择"嘻哈/说唱",选择"Jay-Z and Kanye West"(这张专辑中的一些歌曲在这一流派下播放,一首在另一首下播放),然后查看专辑(再次只有1首——《守望王座》),它只显示一首曲目,而不是15首。

这是双向的。如果我首先通过"嘻哈/说唱"类型选择专辑,专辑将显示两种类型的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
}
}

我曾尝试在viewWillAppear()中使用self.tableView.reloadData(),但也不起作用。在其他类型选择上,视图显示正确的数据-

只有当一张专辑被分成多个流派时,表格才会决定保留第一张被选中的专辑。我希望我已经很好地解释了我的问题。

谢谢!

编辑:链接到图片!https://i.stack.imgur.com/Kz9j1.jpg

编辑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()方法不起作用后,我被引导相信视图在彼此之间发送了不正确的数据(Genre)。然后,我将标题设置为专辑视图,作为它从以前的视图控制器接收到的流派,但即使这样也没问题。然后,我尝试实现viewWillAppear(),并在此处重新调用mediaQuery,并在视图首次加载时从数组中删除所有值。不幸的是,这些都没有奏效。我真的看不出哪里出了问题。我还尝试在viewWillAppear()中重新加载数据,但没有成功。我的下一次尝试是从上一个视图控制器返回整个numberOfSongs数组。我有一种感觉,即使这样做有效,当我真正列出专辑中的歌曲时,我也会遇到同样的问题。

第4版-这是一个iOS错误:

这个BUG也存在于股票音乐应用程序中!我应该在不久前检查一下,但股票音乐应用程序中也发生了完全相同的事情!这就是你可以复制错误的方法:

  1. 将一张专辑分为两种类型(进入iTunes,从一张专辑中选择X首歌曲,并将类型更改为"XXXXXX",然后将专辑中剩余的N首歌曲设置为类型"NNNNNNN"-将"NNNNNN"one_answers"XXXXX"替换为您选择的类型),然后同步您的设备
  2. 进入股票音乐应用程序并进入流派,选择专辑后面的"XXXXXX"流派,您将看到X首歌曲
  3. 现在返回并选择专辑后面的"NNNNNNN"流派,你仍然会看到X首歌曲,而不是你预期的N首歌曲

重复使用单元格。当你拿到一个手机时,不要以为它是空白的。例如,在此代码中:

if(trackCount != nil){
cell.albumDetail.text = "(self.numberOfSongs[indexPath.row]) tracks"
}

文本可能已设置。您应该添加一个else块来将文本设置为其默认状态。

您也可以在prepareForReuse中将单元格重置为其默认状态。

发现这是一个iOS错误-以下是如何在股票音乐应用程序中复制它:

  1. 将一张专辑分为两种类型(进入iTunes,从一张专辑中选择X首歌曲,并将类型更改为"XXXXXX",然后将专辑中剩余的N首歌曲设置为类型"NNNNNNN"-将"NNNNNN"one_answers"XXXXX"替换为您选择的类型。),然后同步您的设备。

  2. 进入股票音乐应用程序并进入流派,选择"XXXXXX"流派,然后选择专辑,您将看到X首歌曲。

  3. 现在返回并选择专辑后面的"NNNNNNN"流派,你仍然会看到X首歌曲,而不是你预期的N首歌曲。

我也向苹果提交了这个错误,所以希望它能在未来的更新中得到修补。

最新更新