根据数组比较更新UICollectionView

时间:2019-01-14 14:38:46

标签: ios swift uicollectionview

我目前有一个collectionView: UICollectionView,它根据称为projects的对象数组显示内容。有时我会从服务器收到名为newProjects的更新数组。 newProjects应该替换projects作为collectionView的数据源。

我想出了一种使用以下代码从数组中删除对象时更新collectionView的方法:

var indexPaths = [IndexPath]()

for project in projects {

    if(!newProjects.contains(project)) {

        let index = projects.firstIndex(of: project)
        indexPaths.append(IndexPath(item: index!, section: 0))
    }                      
}

collectionView.deleteItems(at: indexPaths)

projects = newProjects
collectionView.reloadData()

这适用于已删除的项目。但是,我也试图对添加的项目做出反应。但是我的代码似乎失败了,因为我不断收到异常:

  

无效的更新:第0节中的无效项数。更新后(65)的现有节中包含的项数必须等于更新前的该节(64)中包含的项数,加号或减去从该部分插入或删除的项目数(插入的0,删除0),再加上或减去从该部分移入或移出的项目数(移入0,移出0)。

我用于添加项目比较的代码是:

// First, the deletion from the code above is called.
// project = newProjects and data reload doesn't happen after deletion.

var addIndexPaths = [IndexPath]()

for project in newProjects {

    if(!projects.contains(project)) {

        projects.append(content)
        addIndexPaths.append(IndexPath(item: projects.count - 1, section: 0))
    }
}

collectionView.insertItems(at: addIndexPaths)

projects = newProject 
collectionView.reloadData()

我确定这段代码有点像黑客工作(因为它不起作用),但是老实说,我无法弄清楚如何可靠地更新UICollectionView。有人有建议或有用的链接吗?干杯!

1 个答案:

答案 0 :(得分:0)

正如Wez所指出的,仅取出所有数据插入和删除操作就可以了。现在整个通话减少为:

projects = newProjects
collectionView.reloadData()

我最初以为那是行不通的,但这是由于服务器出现问题。我还没有尝试过,以为我需要手动插入所有更改的项目。

正如rmaddy所指出的,将reloadData()从原始代码中删除也是可行的!我最初的想法是出于某种原因,在添加和删除项目之后需要reloadData(),这可能是因为我还认为UITableViews要求您致电endUpdates()……我使一些基本概念过于复杂。

谢谢大家!