Удалить ячейку из UICollectionView без перезагрузки - PullRequest
0 голосов
/ 22 декабря 2019

Мое приложение прослушивает событие сокета, которое сообщает ему, когда произошло обновление данных, которые в данный момент отображаются на экране collectionView. Когда это происходит, я бы хотел удалить ячейку, соответствующую обновленной строке, из источника данных и из collectionView. Я могу сделать это следующим образом:

  1. отфильтровать данные, чтобы они содержали только элементы с идентификатором, отличным от идентификатора обновленного элемента
  2. установить эти новые данные в качестве данных, используемыхcollectionView
  3. перезагрузите collectionView

    socket.on(DATA_UPDATE) { (data, ack) in
           if let dat = data[0] as? [String: Any] {
              if let tabId = dat["tabId"] as? Int, let resId = dat["resId"] as? Int {
                 let remainingData = self.data?.filter{ $0.tabId != tabId }
                 if resId == self.restaurant?.id && remainingData?.count != self.data?.count {
                     self.data = remainingData
                     self.filterTableDataAndRelaod()
                 }
              }
           }
        }
    

Проблема в том, что он обновляет весь collectionView, а также прокручивает вверхнаверхЯ хотел сделать это, используя следующий код:

self.data.remove(at: indexPath.row)
collectionView.deleteItems(at: [indexPath])

Однако я не уверен, как получить indexPath в приведенном выше фрагменте кода.

1 Ответ

1 голос
/ 22 декабря 2019

Вы можете попробовать

 var toDele = [IndexPath]()
    if let tabId = dat["tabId"] as? Int, let resId = dat["resId"] as? Int {
       for (index,item) in self.data?.enumerated() {
           if item.tabId == tabId {
              toDele.append(IndexPath(item:index,section:0)) 
           }
        } 

        for item in toDele {
            self.data?.remove(at:item.item)
        }
       collectionView.deleteItems(at:toDele )
  }

или, если у вас нет дубликатов

   if let tabId = dat["tabId"] as? Int, let resId = dat["resId"] as? Int {
       if let ind = self.data?.firstIndex(where:{ $0.tabId == tabId }) {
            self.data?.remove(at:ind) 
            collectionView.deleteItem(at:IndexPath(item:ind,section:0))
       }
   }
...