gpt4 book ai didi

ios - tableview 加载一些旧数据 - 库存 iOS 音乐应用程序中的错误

转载 作者:行者123 更新时间:2023-11-28 13:14:33 26 4
gpt4 key购买 nike

不确定如何表达,但我正在创建一个音乐应用程序,并且我有一个流派选项卡按钮,该按钮将流派列为 UICollectionView 中的单元格。

然后用户选择一个流派,比如“Hip-Hop”,然后会显示相应的艺术家,例如“Jay-Z、Kanye West、Kendrick Lamar...”等。如果用户选择“Jay-Z 和 Kanye West”,则会显示他们的艺术家的专辑,其中应用了流派谓词。

在这种情况下,它是一张专辑“Watch the Throne”和该专辑中的一首歌曲。但是现在,如果我回到我的流派收藏 View 并选择“嘻哈/说唱”并选择“Jay-Z 和 Kanye West”(这张专辑中的一些歌曲显示在这种流派下,一首显示在另一种流派下)然后查看专辑(又只有 1 张 - “Watch the throne”),它只显示一首轨道而不是 15 首。

这是双向的。如果我首先通过“Hip Hop/Rap”类型选择专辑,则专辑将显示两种类型的 15 首轨道,如果我选择“Hip-Hop”类型,则专辑将显示两种类型的一首歌曲。该表以某种方式存储了第一个点击类型的数据。我有一组图片来说明我的意思,但我必须有 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() 但这也不起作用。在其他流派选择上, View 显示正确的数据 -

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

谢谢!

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

编辑 4 - 这是一个 iOS 错误:

此错误也存在于股票音乐应用程序中!我早该检查一下,但在股票音乐应用程序中发生了完全相同的事情!这是复制错误的方法:

  1. 将一张专辑分为两种流派(进入 iTunes,从一张专辑中选择 X 首歌曲并将流派更改为“XXXXXX”,然后将专辑中剩余的 N 首歌曲设置为“NNNNNNN”流派 - 替换'NNNNNNN' 和 'XXXXXX' 到您选择的流派。)然后同步您的设备
  2. 进入库存音乐应用并转到流派,选择“XXXXXX”流派,然后选择专辑,您将看到 X 首歌曲
  3. 现在返回并选择“NNNNNNN”流派和专辑,您仍然会看到 X 首歌曲,而不是您预期的 N 首歌曲。

最佳答案

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

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

文本可能已经设置好。您应该添加一个 else block 以将文本设置为其默认状态。

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

关于ios - tableview 加载一些旧数据 - 库存 iOS 音乐应用程序中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29571307/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com