Unable to delete UICollectionView cell after reloading it

I am having a problem with UIcollectionView, and I think this is the problem that is currently causing the problem.

Ok, so I have a collection that loads objects from a class, which is updated very often, maybe every few seconds.

The first problem I encountered; it was that when I selected the cell and selected it, highlighting another cell below as a collection. My solution was to create an array of selected cells and run a loop through a new array to decide what to select.

Now the problem occurs when the data collection is rebooted. The cells continue to remain selected and appear as selected, but they do not change the registrations, so I can not deselect.

- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection: (NSInteger)section { return [self.deviceList count]; } - (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView { return 1; } - (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { DeviceCollectionViewCell *cell = [self.deviceCollectionView dequeueReusableCellWithReuseIdentifier:@"DeviceCell" forIndexPath:indexPath]; if([self.deviceList count] > indexPath.row) { cell.device = [self.deviceList objectAtIndex:indexPath.row]; } if ([[self.deviceCollectionView indexPathsForSelectedItems] containsObject:indexPath]) { NSLog(@"does it ever?"); // cell.backgroundColor = [UIColor blueColor]; } for (TDDeviceParser *device in self.selectedDevices) { if ([cell.device.deviceTextRecord.serialNumber isEqualToString:device.deviceTextRecord.serialNumber]) { [cell setSelected:YES]; break; } else { [cell setSelected:NO]; } } return cell; } - (UICollectionReusableView *)collectionView: (UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { UICollectionReusableView *reusableview = nil; if (kind == UICollectionElementKindSectionHeader) { TitleHeaderForDeviceCollectionView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath]; reusableview = headerView; } else if (kind == UICollectionElementKindSectionFooter) { LogoFooterForDeviceCollectionView *footerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"FooterView" forIndexPath:indexPath]; reusableview = footerView; } return reusableview; } #pragma mark - UICollectionViewDelegate - (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath { //Iphone Five and Older Ipads: Max2 int maxCount = 2; //ipad 4 if ([[UIDeviceHardwareVersion platform] isEqualToString:@"iPad3,4"] || [[UIDeviceHardwareVersion platform] isEqualToString:@"iPad3,5"] || [[UIDeviceHardwareVersion platform] isEqualToString:@"iPad3,6"]) { maxCount = 4; } //Ipod5th,Iphone4 & Iphone4s; Don't select, just play. else if ([[UIDeviceHardwareVersion platform] isEqualToString:@"iPod5,1"] || [[UIDeviceHardwareVersion platform] isEqualToString:@"iPhone4,1"] || [[UIDeviceHardwareVersion platform] isEqualToString:@"iPhone3,1"] || [[UIDeviceHardwareVersion platform] isEqualToString:@"iPhone3,2"] || [[UIDeviceHardwareVersion platform] isEqualToString:@"iPhone3,3"]) { maxCount = 0; //Just play. [self.selectedDevices removeAllObjects]; [self.selectedDevices addObject:[self.deviceList objectAtIndex:indexPath.row]]; [[TDDeviceManager sharedInstance] removeObserver:self]; [self performSegueWithIdentifier:@"VideoPlayer" sender:self]; } if (self.selectedDevices.count < maxCount) { return YES; } else { return NO; } } - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { [self.selectedDevices addObject:[self.deviceList objectAtIndex:indexPath.row]]; [self updatePlayerImages]; NSLog(@"device Count %d",self.selectedDevices.count); } - (BOOL)collectionView:(UICollectionView *)collectionView shouldDeselectItemAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"Should I Deselect?"); return YES; } - (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"%s",__PRETTY_FUNCTION__); //What device do we remove? for (TDDeviceParser *device in self.selectedDevices) { if ([device.deviceTextRecord.serialNumber isEqualToString:((TDDeviceParser*)[self.deviceList objectAtIndex:indexPath.row]).deviceTextRecord.serialNumber]) { NSLog(@"%s Removed %@",__PRETTY_FUNCTION__, device.name); [self.selectedDevices removeObject:device]; break; } } NSLog(@"%s Update %d",__PRETTY_FUNCTION__, self.selectedDevices.count); [self updatePlayerImages]; } 
+4
source share
1 answer

I think the problem is that the cell is selected, but CollectionView did not know that the cell was selected. I added (second line) to fix the problem.

  [cell setSelected:YES]; [self.deviceCollectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone]; 
+12
source

Source: https://habr.com/ru/post/1492157/


All Articles