UICollectionViewCell是否有viewWillAppear或我可以传递数据的东西

时间:2015-08-19 05:16:26

标签: ios objective-c uiviewcontroller uicollectionview uicollectionviewcell

我在视图控制器中有这个:

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

     cell.dataObjects = data;

     return cell;
}

在我的CellSubclass.m中,我有:

- (id) initWithFrame:(CGRect)frame
{
    // You can call initWithFrame: method here as our base constructor of the UIView super class
    self = [super initWithFrame:frame];

    if (self)
    {
        // call functions that need access to data but data is nil
    }

    return self;
}

因此,在我的视图控制器的生命周期中,CellSubclass会在数据准备好之前立即被调用。是否有像viewWillAppear这样的函数或者我可以传递数据的东西?如何从我的视图控制器调用initWithFrame以外的函数?我可以通过其他方式传递数据吗?

感谢。

3 个答案:

答案 0 :(得分:3)

在cellForItemAtIndexPath中使用您自己的配置方法听起来更好。

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

     cell.dataObjects = fetchedMUtableArray[indexPath.row];

     [cell somethingConfiguringMethods];

     return cell;
}

答案 1 :(得分:3)

UICollectionViewCell 没有类似的内容,但这是UIView的子类,并且有一个 didMoveToSuperview 。 我在生产中将它用于某些特定情况,但无论如何它也有助于一些快速调试。

https://developer.apple.com/documentation/uikit/uiview/1622433-didmovetosuperview

答案 2 :(得分:1)

如果您没有要显示的数据,则应将单元格数返回为0。准备好数据后,只需重新加载集合视图。

在您的数据源方法

- (NSInteger)collectionView:(UICollectionView *)collectionView
     numberOfItemsInSection:(NSInteger)section {
    if (self.collectionViewData)
        return self.collectionViewData.count; 
    else
        return 0;
}

假设您有一个异步网络调用并且它已返回数据。 在完成块中只需重新加载集合视图。

-(void)fetchData {
    [httpClient fetchDataWithCompletionBlock:^(NSArray *data) {
        [self.collectionView reloadData];
    }];
}