UICollectionView CellForItemAtIndexPath未被调用

时间:2014-04-02 02:57:38

标签: ios uicollectionview

我的UICollectionViews中有两个UIViewController

假设它们是A和B,A和B位于nib文件中UIViewcontroller中的相同位置,它们具有完全相同的大小。

现在我设置

A.delegate = self;
A.dataSource = self;

B.delegate = self;
B.dataSource = self;

[A registerNib:nib forCellWithReuseIdentifier:CELL_A];

[B registerNib:nib forCellWithReuseIdentifier:CELL_B];
ViewDidLoad

中的

然后在CellForItemAtIndexPath

我使用switch语句来显示不同的单元格。

然后我使用段控件来控制在我选择的段上显示正确的UICollectionViewcontroller

在段控制值中更改了代码。我用:

- (IBAction)sectionSelected:(id)sender {
    if (choosing A) {
        B.hidden = YES;
        A.hidden = NO;
        A.backgroundColor = [UIColor blackColor];
        [self getAData];
        [A reloadData];
    }
    else if (choosing B) {
        A.hidden = YES;
        B.hidden = NO;
        B.backgroundColor = [UIColor orangeColor];
        [self getBData];
        [B reloadData];
    }
}
当我将默认选定的段设置为A时,

A正确显示。但是当我切换到B时,我可以看到B是加载但是数据没有加载到B所以除了橙色背景之外我什么都看不见。我把NSLog放在CellForItemAtIndexPath中,发现reloadData之后没有调用该方法。

以下是A.collectionViewLayout.collectionViewContentSize;B.collectionViewLayout.collectionViewContentSize;

的一些日志记录
content size of B = 768.000000, 24.000000
content size of A = 768.000000, 880.000000

当我将默认选定的段设置为B时,B正确显示。我切换回A,也正确显示。然而,当我再次切换回B时,它显示一个空的橙色屏幕。知道我的代码出了什么问题吗?

3 个答案:

答案 0 :(得分:2)

来自this answer

更改

  [A reloadData]/ [B reloadData] 

为:

  [self.collectionView reloadItemsAtIndexPaths:[self.collectionView indexPathsForVisibleItems]];
  [self.collectionView reloadData];

答案 1 :(得分:1)

可能您丢失了数组对象中的项目数据,用于重新加载/创建集合视图单元格。仔细检查数组/数据。

答案 2 :(得分:0)

你的getAData / getBData是异步调用吗?您可能遇到数据尚未就绪的竞争条件,因此当您调用reloadData时,集合视图正在创建的单元格数量为0.这也可以解释内容大小中的小高度。