保持对 collectionView 的视图引用加倍

Keep reference of views from collectionView is doubled

尝试在添加到集合视图的所有视图的数组中保留引用。

那么会发生什么,我有这个包含数据的数组,但是当我向下滚动集合时,它会调用可重用单元格函数,并尝试将它们再次添加到我的数组中,尽管我正在检查它们是否在再次添加它们之前是否存在:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
 UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath];

 //quantity
    UILabel *quantityL=[[UILabel alloc] initWithFrame:CGRectMake(cell.frame.size.width/10,cell.frame.size.width/10, cell.frame.size.width/5,cell.frame.size.width/5)];
    quantityL.text=[NSString stringWithFormat:@"%d",quantity];
    quantityL.font=[UIFont fontWithName:[Globals sharedGlobals].titleFont size:[Globals sharedGlobals].badgeSize];
    quantityL.textAlignment=NSTextAlignmentCenter;
  //more and more stuff

 [cell addSubview:quantityL]; //add to cell
    if(![allQuantities containsObject:quantityL])  //check if already in array!
    [allQuantities addObject:quantityL];  //add to array 

我可以看到 allQuantities 数组正在改变其大小...为什么?

要正确重用和设置框架:控制器代码:

#define kMyCellIdentifier @"kMyCellIdentifier"

- (void)viewDidLoad {
    [super viewDidLoad];
    //...
    [self.collectionView setDelegate:self];
    [self.collectionView setDataSource:self];
    [self.collectionView registerClass:[MyCollectionViewCell class] forCellWithReuseIdentifier:kMyCellIdentifier];
}

#pragma mark - UICollectionViewDelegate && UICollectionViewDataSource

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    MyCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:kMyCellIdentifier forIndexPath:indexPath];
    [cell.textLabel setText:@"blah"];

    return cell;
}

你的细胞子类:

@interface MyCollectionViewCell : UICollectionViewCell

@property(nonatomic, readonly) UILabel *textLabel;

@end

@implementation MyCollectionViewCell

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        _textLabel = [[UILabel alloc] init];
        [self.textLabel setTextAlignment:NSTextAlignmentCenter];
        [self.contentView addSubview:self.textLabel];
    }

    return self;
}

- (void)layoutSubviews {
    [super layoutSubviews];
    CGRect rect = self.contentView.bounds;

    [self.textLabel setFrame:rect];
}