tableview加载一些旧数据 - BUG IN STOCK iOS MUSIC APP

时间:2015-04-10 21:58:20

标签: ios uitableview swift

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

然后,用户选择一种类型,比如" Hip-Hop"并且显示相应的艺术家,例如" Jay-Z,Kanye West,Kendrick Lamar ......"如果用户选择了Jay-Z和Kanye West'显示他们的艺术家专辑,其中应用了流派谓词。

在这个例子中,它是一张专辑"观看王座"那首专辑中有一首歌。但现在如果我回到我的流派集合视图并选择" 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也存在于股票音乐应用程序中!我应该在不久前检查过这个,但完全相同的事情发生在股票音乐应用程序中!这就是你可以复制错误的方法:

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

2 个答案:

答案 0 :(得分:1)

细胞被重复使用。当你得到一个单元格时,不要认为它是空白的。例如,在此代码中:

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

可能已经设置了文本。您应该添加else块以将文本设置为其默认状态。

您还可以将单元格重置为prepareForReuse中的默认状态。

答案 1 :(得分:1)

原来这是一个iOS错误 - 以下是你可以在股票音乐应用程序中复制它的方法:

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

  2. 进入股票音乐应用程序并转到流派,选择' XXXXXX'然后是专辑的类型,你会看到X个歌曲。

  3. 现在返回并选择' NNNNNNN'专辑后面的类型,你仍然可以看到X号歌曲而不是你期待的N首歌曲。

  4. 我还向Apple提交了这个错误,所以希望它可以在未来的更新中修补。