2

画像のリストを含む UITableView があり、各行には 4 が含まれUITableViewCell、ユーザーは複数の画像を選択できます (選択は、セル上のオーバーレイ画像を非表示にして表示することによって行われます) 私がしたいことは、ユーザーが削除ボタンをクリックしたときに、選択したものを削除することです私のテーブルからの画像。

コードの一部を次に示します。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"Cell";    
ThumbnailImageCell *cell = (ThumbnailImageCell *)[tableView dequeueReusableCellWithIdentifier:@"Cell"];

if (cell == nil)
{               
    cell = [[[ThumbnailImageCell alloc] initWithManagedImages:[self imagesForIndexPath:indexPath] reuseIdentifier:CellIdentifier] autorelease];
}   
else
{       
    [cell setImages:[self imagesForIndexPath:indexPath]];
}

return cell;}



-(NSArray*)imagesForIndexPath:(NSIndexPath*)_indexPath {

int index = (_indexPath.row*4);
int maxIndex = (_indexPath.row*4+3);

if(maxIndex < [self.imagesArray count]) {

    return [NSArray arrayWithObjects:[self.imagesArray objectAtIndex:index],
            [self.imagesArray objectAtIndex:index+1],
            [self.imagesArray objectAtIndex:index+2],
            [self.imagesArray objectAtIndex:index+3],
            nil];
}

else if(maxIndex-1 < [self.imagesArray count]) {

    return [NSArray arrayWithObjects:[self.imagesArray objectAtIndex:index],
            [self.imagesArray objectAtIndex:index+1],
            [self.imagesArray objectAtIndex:index+2],
            nil];
}

else if(maxIndex-2 < [self.imagesArray count]) {

    return [NSArray arrayWithObjects:[self.imagesArray objectAtIndex:index],
            [self.imagesArray objectAtIndex:index+1],
            nil];
}

else if(maxIndex-3 < [self.imagesArray count]) {

    return [NSArray arrayWithObject:[self.imagesArray objectAtIndex:index]];
}

return nil;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return ceil([self.imagesArray count] / 4.0);
}

私がやろうとしたことは次のとおりですが、今まで成功していません

-(void)finishDeleting{
int countOfDeletedThread;
[self setEditing:YES animated:YES];
[self.tableView beginUpdates];

NSMutableIndexSet *mutableIndexSet = [[NSMutableIndexSet alloc] init];
NSMutableArray *indexToDelete = [[NSMutableArray alloc] init];
NSIndexPath *indexPath ;

for(ThumbnailImage *thumbnailImage in self.imagesArray)
{
    if([thumbnailImage selected])
    {
       countOfDeletedThread = countOfDeletedThread+1;
       indexPath = [NSIndexPath indexPathForRow:countOfDeletedThread inSection:0];

        [indexToDelete addObject:indexPath];
        [mutableIndexSet addIndex:indexPath.row];

    }
}
[self.imagesArray removeObjectsAtIndexes:mutableIndexSet];
[self.tableView deleteRowsAtIndexPaths:indexToDelete withRowAnimation:UITableViewRowAnimationFade];

[indexToDelete release];
[mutableIndexSet release];

[self.tableView endUpdates];
[self.tableView setEditing:NO animated:YES];
[self.tableView reloadData];
[CATransaction flush];}

何か助けてください。2日間立ち往生していて、どうすればよいかわかりません。

ありがとうございました。

4

1 に答える 1

1

私が正しく理解している場合、UIImageViewテーブルの行ごとに 4 秒ではなく 4UITableViewCell秒があります。つまり、画像のサブセットを削除すると、残りの画像はすべての行で「リフロー」します。したがって、使用しても意味がありません beginUpdates/deleteRowsAtIndexPaths/endUpdates。あなたはおそらくただすべきです

  • 選択した画像をデータ ソース配列から削除しますself.imagesArray
  • コール[self.tableView reloadData]

配列から選択した画像を削除することは、次のように少し単純化できます。

NSIndexSet *indexSet = [self.imagesArray indexesOfObjectsPassingTest:^BOOL(ThumbnailImage *thumbnailImage, NSUInteger idx, BOOL *stop) {
    return [thumbnailImage selected];
}];
[self.imagesArray removeObjectsAtIndexes:indexSet];

UICollectionView(iOS 6 以降で利用可能) は、1 行に複数の画像を表示するのにより適している可能性があることに注意してください。

于 2013-11-02T10:49:47.597 に答える