Удалить определенные элементы в UICollectionView - PullRequest
0 голосов
/ 06 сентября 2018

Я хочу удалить ячейки в UICollectionView, которые имеют определенный идентификатор. Таким образом, ячейка может быть в середине представления.

Для этого я удаляю элемент из массива ячеек, а также удаляю indexPath. IndexPath должен быть получен первым. Это невозможно!

Каким-то образом невидимые / скрытые ячейки (под текущим представлением необходимо прокрутить вверх) нельзя удалить, поскольку они оказываются равными NIL.

Как получить доступ к определенной ячейке (с идентификатором) и удалить ее?

    let cellIdToFeedItem_ToDelete = [ String : FeedItem ]() // here are the item to be deleted
    var indexPathsToRemove        = [ IndexPath ]()
    var indexPathsAllActive       = [ IndexPath ]() // Will be filled below

    // --- retrieving all indexPaths
    if let nrSections = self.collectionView?.numberOfSections
    {
        for s in 0..<nrSections
        {
            if let v = self.collectionView?.numberOfItems( inSection: s )
            {
                for i in 0..<v
                {
                    let indexPathTMP = IndexPath( item: i, section: s )
                    indexPathsAllActive.append( indexPathTMP )
                }
            }
        }
    }

    // --- delete the items with the same
    for indexPath in indexPathsAllActive
    {
        // #### FOR HIDDEN CELLS THIS IS 'NIL'
        let cell = self.collectionView?.cellForItem( at: indexPath ) as? FeedCollectionViewCell

        if let cellID = cell?.id
        {
            if let _ = cellIdToFeedItem_ToDelete[ cellID ]
            {
                if let index = feedItemsActive_.firstIndex( where: {
                    (i) -> Bool in
                    i.id == cellID
                } )
                {
                    feedItemsActive_.remove( at: index )
                    indexPathsToRemove.append( indexPath )
                }
            }
        }
    }

    self.collectionView?.deleteItems( at: indexPathsToRemove )

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Это сделало работу. Но без анимации:

    for ( cellID, _ ) in cellIdToFeedItem_ToDelete
    {
        if let index = feedItemsActive_.firstIndex( where: {
            (i) -> Bool in
            i.id == cellID
        } )
        {
            feedItemsActive_.remove( at: index )
        }
    }

    self.collectionView?.reloadData()
0 голосов
/ 06 сентября 2018

Удалите элементы из вашего источника данных (я полагаю, indexPathsAllActive?), А затем перезагрузите свой collectionView, чтобы показать изменения.

Без анимации:

collectionView.reloadData()

С анимацией:

collectionView.performBatchUpdates{ }

Вот как вы будете использовать executeBatchUpdates с вашим кодом: (Если у вас есть один раздел)

collectionView?.performBatchUpdates({
    var targetIndexPaths: [IndexPath] = []
    for ( cellID, _ ) in cellIdToFeedItem_ToDelete
    {
        if let index = feedItemsActive_.firstIndex( where: { $0.id == cellID } )
        {
            feedItemsActive_.remove( at: index )
            targetIndexPaths.append(IndexPath(item: index, section: 0))
        }
    }
    collectionView?.deleteItems(at: targetIndexPaths]) 
}, completion: nil)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...