在UICollectionViewDelegate中调用UICollectionView#reloadData#collectionView:didSelectItemAtIndexPath:隐藏所有单元格

时间:2013-09-24 19:57:15

标签: ios objective-c ios7

我有一个UIViewController,它具有didSelectItemAtIndexPath的以下实现

@interface

id section1Item
NSMutableArray *section2Items
NSMutableArray *section3Items

@end

@implementation

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

    if (indexPath.section == 0) {

        ;

    } else if (indexPath.section == 1) {

        self.section1Item = [self.section2Items objectAtIndex:indexPath.row];

    } else { // indexPath.section == 2

        id newSection2Item = [self.section3Items objectAtIndex:indexPath.row];

        [self.section2Items addObject:newSection2Item];

        [self.section3Items removeObject:newSection2Item];

     }


     [collectionView reloadData];

 }

 @end

代码背后的想法是我的collectionView具有静态数量的部分,并且在第3部分中的项目上移动将项目移动到第2部分,并且点击第2部分中的项目使其成为第1部分中的项目。

但是,一旦我对dataStructure(section1Item,section2Items和section3Items)进行了更改,并调用reloadData,我的所有UICollectionView单元格都会消失。问题的一些症状

  1. 在reloadData调用之后,我的dataSource方法将被调用。我尝试在我的numberOfSectionsInCollectionView和collectionView:numberOfItemsInSection的实现中添加一个断点,但它们没有被击中。
  2. 我尝试使用RevealApp进行调试,我发现在reloadData调用之后,我的所有UICollectionViewCell都将其隐藏属性设置为“YES”,即使我的代码库中没有任何代码调用.hidden = YES;
  3. 我还尝试重写UICollectionViewCell#setHidden以检测UIKit框架的哪个(如果有的话)部分调用它,并且再次没有断点触发器。
  4. 工具详情:我在iOS7模拟器上使用XCode5-DP6。

    UPDATE:我的UICollectionView在首次渲染时正确显示所有单元格。

2 个答案:

答案 0 :(得分:0)

好的偷看,所以我能够找出问题所在。委托(self)是UIViewController的子类。在init中,我正在分配self.view = viewFromStoryBoard,其中viewFromStoryBoard由调用者传入,并且是在故事板中设置的。

由于我没有真正使用子类UIViewController提供的任何功能,我决定切换到子类NSObject并手动保留指向UICollectionView的指针。

这解决了我的问题。但是,我不是100%的问题的确切性质。我猜不知怎样覆盖UIViewController的视图并不是它看起来的全部。

答案 1 :(得分:0)

iOS 7和UICollectionView存在很多错误...在我的情况下,reloadData无法正常工作,它可以延迟使用。