UICollectionView reloadData 无法正常工作

Posted

技术标签:

【中文标题】UICollectionView reloadData 无法正常工作【英文标题】:UICollectionView reloadData doesn't work correctly 【发布时间】:2015-03-16 08:06:37 【问题描述】:

我遇到了一个奇怪的问题,当我从一个动作(按钮)执行我的 UICollectionView 的 reloadData 时,单元格没有正确显示,只有单元格的背景图像可以。

我的“INVPropertyCell”由一张背景图片和 2 个标签(标题和价格)组成。当我执行 reloadData 时,单元格中的上述标签随机消失。

我在不同的论坛上做了很多搜索,有些人有同样的问题,但我没有找到解决办法。

下面是我的代码,如果有人可以帮助我,将不胜感激。

杰罗姆。

- (void)viewDidLoad

    NSLog (@"INVPropertiesViewController -- viewDidLoad");


    [super viewDidLoad];

    // Enregistrement de la cellule.
    [self.clProperties registerNib:[UINib nibWithNibName:@"INVPropertyCell" bundle:nil] forCellWithReuseIdentifier:@"propertyCell"];

    // Enregistrement du header de section
    [self.clProperties registerNib:[UINib nibWithNibName:@"INVPropertyHeaderSection" bundle:nil] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"headerCollectionCell" ];


    self.clProperties.delegate = self;
    self.clProperties.dataSource =self;


    NSLog (@"INVPropertiesViewController -- End of viewDidLoad");


- (void)viewWillAppear:(BOOL)animated

    NSLog (@"INVPropertiesViewController -- viewWillAppear");

    [super viewWillAppear:animated];

    categoryDictionary = [ServiceDatas getCategoriesDictionary];
    tblProperties = [(NSArray*)[ServiceDatas getListPropertiesByLieuFromLocalDataStore:self.selectedResidence] mutableCopy];

    if(tblProperties.count==0 & self.selectedResidence.propertiesCount.longValue >0)
        tblProperties = [(NSArray*)[ServiceDatas getListPropertiesByLieuFromServer:self.selectedResidence] mutableCopy];

    tblPropertiesByCategory = [ServiceDatas createCategoryBreakDown:tblProperties];

    keysCategories = [tblPropertiesByCategory allKeys];


    [self.clProperties reloadData];


    NSLog (@"INVPropertiesViewController -- End of viewWillAppear");



- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
   // [self.clProperties.collectionViewLayout invalidateLayout];
    return tblPropertiesByCategory.count;


- (UICollectionReusableView *)collectionView: (UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath

    UICollectionReusableView *reusableview = nil;

    if(kind == UICollectionElementKindSectionHeader)


        INVPropertyHeaderSection *headerSection = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"headerCollectionCell" forIndexPath:indexPath];

        id categoryId = [keysCategories objectAtIndex:indexPath.section];

        CategoryModel *category = categoryDictionary[categoryId];

        if(category!=nil)

            headerSection.backgroundColor = [Utils colorFromHexString:category.color];
            headerSection.lblCategory.text = [category.title uppercaseString];

        


        reusableview = headerSection;


    else if(kind == UICollectionElementKindSectionFooter)

        if (reusableview==nil) 
            reusableview=[[UICollectionReusableView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
        

    

    return reusableview;



- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

    // Return the number of rows in the section.

    id categoryId = [keysCategories objectAtIndex:section];
    NSMutableArray *tblProperties = [tblPropertiesByCategory objectForKey:categoryId];


    return [tblProperties count];



// The cell that is returned must be retrieved from a call to -dequeueReusableCellWithReuseIdentifier:forIndexPath:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

    INVPropertyCell *cell = nil;

    id categoryId = [keysCategories objectAtIndex:indexPath.section];

    NSMutableArray *tblProperties = [tblPropertiesByCategory objectForKey:categoryId];


    if(tblProperties!=nil)

        cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"propertyCell" forIndexPath:indexPath];

        PropertyModel *property = [tblProperties objectAtIndex:indexPath.item];

        NSLog(@"Ligne %ld - Colonne %ld - Lieux %@",indexPath.section, (long)indexPath.item, property.title );

        CategoryModel *category = categoryDictionary[categoryId];

        if(category!=nil)

            [cell initWithProperty:property backgroundColor:[Utils colorFromHexString:category.color]];

        


    


    return cell;



- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

    // Récupération du bien courant.
    id categoryId = [keysCategories objectAtIndex:indexPath.section];

    NSMutableArray *tblProperties = [tblPropertiesByCategory objectForKey:categoryId];

    PropertyModel *property = [tblProperties objectAtIndex:indexPath.row];

    NSLog(@"Property sélectionnée : %@",property.title);

    self.selectedProperty = property;

    if(property!=nil && [property.title isEqualToString:EMPTY_PROPERTY])
        self.selectedProperty = nil;
    

    // Déclenche le Segue pour aller à l'écran "Property"
    [self performSegueWithIdentifier:@"segueEditPropertyView" sender:self];



// Layout: Set cell size
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 

    CGSize mElementSize = CGSizeMake(107, 106);

    if(indexPath.item==0)
        mElementSize = CGSizeMake(106, 106);
    

    return mElementSize;


- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section 
    return 0.0;


- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section 
    return 0.0;


// Layout: Set Edges
- (UIEdgeInsets)collectionView:
(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section 
    return UIEdgeInsetsMake(0,0,0,0);  // top, left, bottom, right


- (IBAction)btnRefresh:(id)sender 

    [self.clProperties reloadData];


【问题讨论】:

重新加载后您的 Cell 会发生什么情况?您可以添加您想要的屏幕截图以及会发生什么吗? 在 viewDidLoad 中注册 Nib 并在 viewWillAppear 中重新加载数据似乎是错误的,因为在执行 viewWillAppear 时,您的 CollectionView 将没有 registerNib。所以最好在 viewDidAppear 中重新加载你的 collectionView 您好,我尝试了您的建议,但问题仍然存在。不幸的是,我无法上传截图来说明这种行为(我是新手,我没有足够的声誉)。为了精确起见,我在帖子中添加了一些额外的 cmets。 【参考方案1】:

我认为,在为 INVPropertyCell 和 INVPropertyHeaderSection 单元格注册 nib 之前,您必须先注册类。

【讨论】:

您好,我听从了您的建议,不幸的是我仍然有问题。【参考方案2】:

如果collectionView..cellForItemAtIndexPath 中的单元格为空,请尝试检查并分配单元格

cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"propertyCell" forIndexPath:indexPath];
if (cell == null) 
    Array *xibs = [[NSBundle mainBundle] loadNibWithNamed:@"propertycell" 
...];
cell = xibs[0];

我正在快速编码,所以上面的语法可能是错误的,但这是个好主意:)

【讨论】:

以上是关于UICollectionView reloadData 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

带有 TableView 和 CollectionView 的 UiView 不会随机刷新

折叠UICollectionView

-[UICollectionView _endItemAnimations] 中的 UICollectionView 断言失败

如何滚动另一个 UICollectionView 下方的 UICollectionView?

UICollectionView 单元内部已加载,但 UICollectionView 未显示

UICollectionView 断言失败 -[UICollectionView _updateWithItems:tentativelyForReordering:]