Ios 保留来自collectionView的视图引用加倍

Ios 保留来自collectionView的视图引用加倍,ios,objective-c,uicollectionview,Ios,Objective C,Uicollectionview,尝试在要添加到集合视图的所有视图的数组中保留引用 发生的情况是,我有一个包含数据的数组,但当我向下滚动集合时,它会调用可重用单元格函数,并尝试再次将它们添加到我的数组中,尽管我在再次添加它们之前会检查它们是否存在: - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath UICollectionViewC

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

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

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

哦,我明白了,每次我创建标签时,它都会得到一个新地址,这样它就不在数组中了……那么我该如何正确地处理这件事呢?很抱歉,这是一个非常糟糕的代码。您的标签无法正确调整大小。您应该子类化
UITableViewCell
,在那里添加一个标签,并使用
layoutSubview
函数来设置帧(或者使用
autolayout
情节提要
)。然后,
表格视图中的单元格出列
。我不会接受这样的代码审查,它只是在任何方面都是错误的。为什么要将
UIViews
保留在一个数组中?这似乎是错误的应用程序架构。好吧,好吧,太可怕了,太可怕了,你是最好的。所以有人不知道怎么做才对,这就是他来这里的原因,所以与其一直在空中告诉我,也许你可以给我一个答案告诉我怎么做才对??(我用代码来做,没有故事板,顺便说一句,效果很好)我把它们放在数组中,这样我就可以用它们做一些特殊的事情,比如用你还不知道的方式给它们制作动画。不要那么傲慢,人们做的事情是有原因的。如果你想做一些特殊的事情,这并不总是对的。我刚刚告诉过你-你应该将UITableViewCell子类化,并将其排出队列。如果您愿意,我可以添加一个示例,但是我不认为我的批评者对您没有任何帮助-它没有示例代码,但包含了所有必需的步骤,您可以在任何教程页面上找到这些步骤。不管怎样,我会写的。@Curnelious好的,这里有一个小代码片段如何做到这一点。现在,由于这不能回答您的问题,我们可能会找到更好的解决方案,您能告诉+-为什么要保留对每个标签的引用吗?谢谢,所以我要添加的标签现在将添加到mycollectionviewcell类中的initwithframe方法中?我保留对它们的引用,因为当您滚动所有图像时,集合中的标签和其他东西都以不同的方式设置动画,因此我必须保存指向标签、图像等的指针。@Curnelious这是模型数据的一部分,不是吗?不需要在视图中存储该信息。你需要接受MVC。我不确定我是否理解你。我的MVC不是在一个数组中有一个位置包含我想要的所有特定视图(不是所有视图,只有部分视图)。。。