UICollectionView,网络数据在与之交互之前不显示单元格

时间:2014-07-06 01:50:28

标签: ios objective-c uicollectionview

我有一个用* .xib加载的UIViewController。此ViewController的一个元素是UICollectionView。我在ViewControllers -viewDidLoad中发出异步网络请求,并在回调时调用self.collectionView reloadData。我也尝试过:

dispatch_async(dispatch_get_main_queue(), ^{
    [self.collectionView reloadData];
});

奇怪的是,collectionView确实加载了单元格而不是没有交互的屏幕上可见的那些单元格。滚动后,滚动到视图的单元格显示正常。当我滚动回到开头时,第一个单元格也会出现。

Problem explained visually

我错过了什么?

我的数据源方法:

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return [self.listItems count];
}

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

    UILabel *lbl = (UILabel *)[cell.contentView viewWithTag:9];
    if (!lbl) {
        UILabel *lbl = [[UILabel alloc] initWithFrame:cell.contentView.frame];
        [lbl setTag:9];
        [cell.contentView addSubview:lbl];
    }

    [lbl setBackgroundColor:[UIColor colorWithRed:1.f green:1.f blue:(10*indexPath.row)/255.f alpha:1]];
    [lbl setText:[NSString stringWithFormat:@"%d", indexPath.row]];

    return cell;
}

在回调中我所做的就是设置self.listItems = myFetchedArray并在collectionView上调用-reloadData ...

1 个答案:

答案 0 :(得分:0)

尝试在collectionView之后更新reloadData布局。

  • Objective-C

[self.collectionView.collectionViewLayout invalidateLayout];

  • Swift

collectionView.collectionViewLayout.invalidateLayout()

  

您可以随时调用此方法来更新布局信息。   此方法使集合视图本身的布局无效   马上回来。因此,您可以多次调用此方法   相同的代码块,不会触发多个布局更新。该   在下一个视图布局更新周期中发生实际布局更新。

Apple - API Reference