5

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

1 に答える 1