gpt4 book ai didi

ios - tableView.deleteRows 后缺少随机 UITableViewCell

转载 作者:行者123 更新时间:2023-11-28 07:44:54 25 4
gpt4 key购买 nike

我正在开发一个在表格中显示音乐记录的应用程序。该表每天分为一个部分。

代码按预期工作,但一旦删除了一个项目,一些行就会呈现为白色。然而,那些白行仍然可以被删除,但不响应didSelectRowAt

显示行为的视频

After an item gets deleted, some rows are rendered white

查看层次结构调试器

Tried to debug it in the view hierarchy debugger

我的尝试

我创建了一个 UITableViewController 子类并实现了协议(protocol) UITableViewDataSourceUITableViewDelegate

appData 是一种结构,它符合 Codable 协议(protocol),并在应用循环通过其状态时进行编码和解码。

appData.scannedAlbumsString: [ScannedAlbum] 的字典(即 "2018-02-21": [ album1, album2, album3 ... ])

在我重构代码以使用部分之前, View Controller 在呈现单元格时没有问题,即使在删除项目之后也是如此。

历史 TableView Controller

class HistoryTableViewController: UITableViewController {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
...

UITableViewDataSource

override func numberOfSections(in tableView: UITableView) -> Int {
guard let sections = appDelegate.appData?.scannedAlbums else { return 0 }

return sections.count
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
guard let albumsInSection = appDelegate.appData?.getAlbums(in: section) else { return 0 }

return albumsInSection.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "AlbumCell", for: indexPath) as! HistoryTableViewCell

if let album = appDelegate.appData?.getAlbum(for: indexPath) {
print("cellForRowAt \(indexPath): \(album.discogsResult?.title ?? album.barCode), \(cell.frame)")
cell.update(with: album)
}

return cell
}

UITableViewDelegate

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
guard let dateString = appDelegate.appData?.getDateString(for: indexPath.section) else {return}
guard let albumsInSection = appDelegate.appData?.getAlbums(in: indexPath.section) else {return}
guard let index = albumsInSection.index(of: albumsInSection[indexPath.row]) else {return}

if albumsInSection.count == 1 {
appDelegate.appData?.scannedAlbums.removeValue(forKey: dateString)
tableView.deleteSections([indexPath.section], with: .automatic)
}
else {
appDelegate.appData?.scannedAlbums[dateString]?.remove(at: index)
tableView.deleteRows(at: [indexPath], with: .automatic)
}
}
}

更新#1

排除if let

Ruling out the if let

更新#2

View 层次结构中没有单元格

View hierarchy

最佳答案

我发现有些东西有点用,但我不知道为什么我必须这样写..

在重写代码以将字典作为 appData.scannedAlbums 并将所有辅助方法移至 appData 本身后, TableView 在删除后仍然存在此视觉错误。

但是,将我的字典的更新添加到 DispatchQueue.main.async 队列后修复了它,除了删除动画似乎很奇怪。

DispatchQueue.main.async {
if albumsInSection.count == 1 {
self.appDelegate.appData?.scannedAlbums.removeValue(forKey: dateString)
tableView.deleteSections([indexPath.section], with: .automatic)
}
else {
self.appDelegate.appData?.scannedAlbums[dateString]?.remove(at: index)
tableView.deleteRows(at: [indexPath], with: .automatic)
}
}

所以我猜这一定是多线程的问题?由于 UI 更新在主线程上,但更新我的 scannedAlbums 字典不是吗?

很想在这里获得一些见解,因为我想正确解决这个问题..:/

关于ios - tableView.deleteRows 后缺少随机 UITableViewCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51388737/

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