2013-07-18 4 views
4

У меня возникла проблема с UIcollectionView, и я думаю, что работа вокруг является тем, что в настоящее время вызывает проблему.Невозможно удалить ячейку UICollectionView после ее перезагрузки

Итак, у меня есть коллекция, которая загружает объекты из класса, которые обновляются очень часто, может быть, каждые несколько секунд.

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

Проблема возникает при перегрузке коллекции. Ячейки продолжают оставаться выделенными и отображаться как выбранные, но они не меняют регистраций, поэтому я не могу отменить выбор.

- (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]; 
} 

ответ

12

Я думаю, проблема в том, что ячейка выбрана, но CollectionView не знал, что ячейка выбрана. Я добавил (вторая строка), чтобы исправить проблему.

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

'scrollPosition:' принимает значение типа 'UICollectionViewScrollPosition', а не BOOL. 'UICollectionViewScrollPositionNone' - правильное значение для использования. – Travis

+0

Спасибо DTDev за решение! Я столкнулся с той же проблемой. –

+0

это спаси мой день – Pikaurd

Смежные вопросы