【问题标题】:NSArray not loading all the objects in the array?NSArray 没有加载数组中的所有对象?
【发布时间】:2012-11-19 15:18:07
【问题描述】:

我目前正在对 UICollectionViewCell 进行子类化,并让它加载数组中的单元格(下面是 collectionViewCell.m 中的代码):

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        NSArray *cellArray = [[NSBundle mainBundle] loadNibNamed:@"insightCell" owner:self options:nil];
NSLog (@"NSArray cellArray %i", [cellArray count]);
 if ([cellArray count] < 1) {
            return nil;
        }
        if (![[cellArray objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) {
            return nil;
        }
        self = [cellArray objectAtIndex:0];
 }
return self;

}

一切正常,它显示了我在- (NSInteger) collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 方法中的返回值,即 11。但是当我记录 cellArray 的启动过程时,它看起来像这样:

因此,单元格数组正在计算数组添加单元格的次数,由于某种原因,它只增加到 6。奇怪的是;加载所有 11 个项目,但 NSArray 没有记录它已加载所有 11 个,它只是在 6 处停止,这很烦人......我尝试了几种不同的方法来解决这个问题,但它们似乎没有工作,它的快把我逼疯了!我想没有其他人遇到过这个问题吗?

我将添加我的 rootController.m 集合视图代码以防万一,但是,它确实以正确的方式链接,所以这不应该是问题。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellID = @"cellID";

    insightCell *myCell = (insightCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];

return myCell;
}

【问题讨论】:

  • 也许您的屏幕上只有 6 个单元格可见。如果您开始滚动,则会生成其他内容。
  • 是的,我想,但是当我滚动它时,它仍然没有将这些单元格添加到日志中。就好像,如果我在 UICollectionView 中有超过 6 个单元格,它不会注册,那么额外的 5 个......
  • 这正是单元重用模式应该做的事情。没有更多的单元格(类型/重用 id)保存在内存中,因为屏幕上立即可见。一旦其中一个完全滚动,它就可以重复使用。自然地,它的 initWithWhatever 方法不再被调用,因为它确实已经存在。因此,您不应该在 init 方法中放置任何业务逻辑。子类化 layoutSubViews 或 cellForRowAtIndexPath 方法来管理内容和内容相关的外观。
  • 正如所显示的代码所做的那样 - 你打算实现什么?为什么你会期待任何不同的行为?
  • 我不确定,我才刚刚开始使用 UICollectionViews 并连接网络数据,所以我以前没有遇到过这种问题。估计是我太天真了!道歉!

标签: ios nsarray uicollectionview uicollectionviewcell


【解决方案1】:

当您使用 dequeueReusableCellWithIdentifier 创建单元格时,它将重用从屏幕滚动出的具有相同 id 的单元格。 见参考:Reference

您可以在 WWDC 2012 视频中找到该主题的精彩演示。

【讨论】:

  • 啊,我明白了。这很烦人。感谢您指出了这一点。好的,有什么办法解决这个问题吗?一种只添加数组中的单元格而不是重用现有单元格的方法?
  • 不要使用 dequeueReusableCellWithIdentifier。请改用 [[insightCell alloc] init]。但这对你来说并不是很好,因为它会产生不必要的细胞。 resue有什么问题?
  • 嗯,我正在使用服务器数据。因此,我在服务器上有数据,这些数据包含在具有 id 的项目中。这些“id”将被分配给单元格,以便每个单元格都包含与来自服务器的 id 匹配的数据,最终结果将显示图像,这是服务器项目数据的一部分。重复使用单元格意味着我可以得到前 6 个项目的图像,但其余 5 个项目不显示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 2016-06-18
  • 2019-07-03
  • 2012-09-14
  • 2023-04-01
相关资源
最近更新 更多