更新单元格视图时重用单元格会导致不需要的行为

时间:2014-06-21 20:24:24

标签: ios objective-c uicollectionview uicollectionviewcell

我想要为选定的单元格设置边框,我保存代表所选单元格的单元格属性并对其进行操作:

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
    NSArray *eyeArray = [self eyesArrayConfigure][indexPath.row];
    if (indexPath.row==5) {
        int r = arc4random() % 6;
        eyeArray = [self eyesArrayConfigure][r];
    }
    [borderedCell.contentView.layer  setBorderWidth:0.0f] ;

    UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
    borderedCell = cell;
    [borderedCell.contentView.layer setBorderColor:self.view.tintColor.CGColor];
    [borderedCell.contentView.layer setBorderWidth:3.0f];

}

和cellForView :(我使用2种类型的单元格标识符,因为一个单元格包含一个标签 - “随机单元格”:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row ==5) {
        UICollectionViewCell *randomCell =[collectionView
                                           dequeueReusableCellWithReuseIdentifier:@"randomCell"
                                           forIndexPath:indexPath];
        randomCell.backgroundColor = [UIColor purpleColor];
        borderedCell = randomCell;
        [borderedCell.contentView.layer setBorderColor:self.view.tintColor.CGColor];
        [borderedCell.contentView.layer setBorderWidth:3.0f];

        return randomCell;
    }
    UICollectionViewCell *myCell = [collectionView  dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];


    NSArray *eyeArray = [self eyesArrayConfigure][indexPath.row];

    myCell.backgroundView = [[UIImageView alloc] initWithImage:eyeArray[1]];


    return myCell;
}

我得到的是,如果单击一个单元格,它将会很好,直到我滚动,然后当几个单元格可能与边框一起时,我会得到奇怪的行为。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

解决方案是使用视图模型。您已经为单元格的背景视图执行此操作。对边框应用相同的概念。

@interface MyCollectionView ()
@property (nonatomic) NSInteger selectedRow;
@end    

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    //update self.selectedRow and either reload entire collection view or just the currently selected and previously selected.
    self.selectedRow = indexPath.row;
    [collectionView reloadData];
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewCell *myCell = [collectionView  dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
    CGFloat borderWidth = (indexPath.row == self.selectedRow) ? 3.0 : 0.0;
    [myCell.contentView.layer setBorderWidth:borderWidth];
    return myCell;
}