在 UICollectionViewDelegate#collectionView:didSelectItemAtIndexPath 中调用 UICollectionView#reloadData:隐

Posted

技术标签:

【中文标题】在 UICollectionViewDelegate#collectionView:didSelectItemAtIndexPath 中调用 UICollectionView#reloadData:隐藏所有单元格【英文标题】:Calling UICollectionView#reloadData in UICollectionViewDelegate#collectionView:didSelectItemAtIndexPath: hides all cells 【发布时间】:2013-09-24 19:57:15 【问题描述】:

我有一个 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 单元格都会消失。问题的一些症状

    在调用 reloadData 之后,我的 dataSource 方法都没有被调用。我尝试在 numberOfSectionsInCollectionView 和 collectionView:numberOfItemsInSection 的实现中放置一个断点,但它们没有被命中。 我尝试使用 RevealApp 进行调试,我发现在调用 reloadData 之后,我的所有 UICollectionViewCell 的隐藏属性都设置为“YES”,即使我的代码库中没有任何代码调用 .hidden = YES; 我还尝试覆盖 UICollectionViewCell#setHidden 以检测 UIKit 框架的哪个部分(如果有)调用它,并且再次没有断点触发器。

工具详情:我在 ios7 模拟器上使用 XCode5-DP6。

更新:我的 UICollectionView 在第一次渲染时正确显示所有单元格。

【问题讨论】:

我怀疑如果您的数据源方法根本没有被调用,这意味着您的 collectionview 本身在某种程度上是 nil。 @BKC 我更新了我的问题,但 collectionView 不是零,因为我的初始渲染发生正确。 在另一个线程中发布了一个对我有用的解决方案 - ***.com/a/14804429 【参考方案1】:

好的,所以我能够找出问题所在。委托 (self) 是 UIViewController 的子类。在初始化中,我分配了self.view = viewFromStoryBoard,其中 viewFromStoryBoard 是由调用者传入的,并且是在情节提要中设置的。

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

这解决了我的问题。但是,我不是 100% 了解问题的确切性质。我猜想以某种方式覆盖 UIViewController 的视图并不是它看起来的全部。

【讨论】:

【参考方案2】:

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

【讨论】:

您必须提供有关“无法正常工作”的更多详细信息,以便其他人可以帮助您。您是否尝试在委托方法中放置断点并查看它们是否在 reloadData 调用后被命中? 这不是一个真正的答案。你应该把它写成评论。

以上是关于在 UICollectionViewDelegate#collectionView:didSelectItemAtIndexPath 中调用 UICollectionView#reloadData:隐的主要内容,如果未能解决你的问题,请参考以下文章

NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据