我正在开发一个在表格中显示音乐记录的应用程序。该表每天分为一个部分。
代码按预期工作,但是一旦删除项目,某些行就会变成白色。但是,那些白色行仍可以删除,但不会响应didSelectRowAt
。
我创建了UITableViewController
子类并实现了协议UITableViewDataSource
和UITableViewDelegate
。
appData
是一种结构,它符合Codable
协议,并且随着应用程序在其状态之间循环而被编码和解码。
appData.scannedAlbums
是String: [ScannedAlbum]
的字典(即“ 2018-02-21”:[album1,album2,album3 ...])
在重构代码以使用节之前,即使删除了一项,视图控制器也不会出现呈现单元格的问题。
class HistoryTableViewController: UITableViewController {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
...
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
}
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)
}
}
}
排除if
视图层次结构中没有单元格
答案 0 :(得分:0)
我发现了一些可行的方法,但我不知道为什么为什么我必须这样写。.
在重写代码以将字典作为appData.scannedAlbums
并将所有帮助程序方法移至appData本身之后,删除后的表格视图仍遭受此视觉错误。
但是,将我的词典的更新添加到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
词典吗?
我想在这里正确解决此问题,所以希望在这里获得一些见解。.:/