tableView.deleteRows之后缺少随机的UITableViewCell

时间:2018-07-17 19:16:13

标签: ios swift uitableview

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

代码按预期工作,但是一旦删除项目,某些行就会变成白色。但是,那些白色行仍可以删除,但不会响应didSelectRowAt

展示行为的视频

After an item gets deleted, some rows are rendered white

查看层次结构调试器

Tried to debug it in the view hierarchy debugger

我的尝试

我创建了UITableViewController子类并实现了协议UITableViewDataSourceUITableViewDelegate

appData是一种结构,它符合Codable协议,并且随着应用程序在其状态之间循环而被编码和解码。

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

在重构代码以使用节之前,即使删除了一项,视图控制器也不会出现呈现单元格的问题。

HistoryTableViewController

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

Ruling out the if let

更新#2

视图层次结构中没有单元格

View hierarchy

1 个答案:

答案 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词典吗?

我想在这里正确解决此问题,所以希望在这里获得一些见解。.:/