我正在使用一个集合视图,我试图从一个集合视图布局切换到另一个使用:
[self.collectionView setCollectionViewLayout:newLayout animated:animated];
这一切似乎都很好,我得到了一个包含所有项目的新布局。
但是,当我切换到新布局时,我只想显示特定部分中的项目。我想我的第一个问题是,有没有人有任何关于实现这一目标的正确方法的指示?
我这样做的方式是从用于集合视图的数组中删除项目。为此,我正在使用
- (void)removeObjectsInArray:(NSArray *)otherArray
从我的模型中删除项目,然后
- (void)deleteSections:(NSIndexSet *)sections
从集合视图中删除部分。
在这样做时,我收到以下错误
*** Assertion failure in -[UICollectionViewData numberOfItemsBeforeSection:],
/SourceCache/UIKit_Sim/UIKit-2380.17/UICollectionViewData.m:415
2013-05-03 07:35:18.543 Clients[69375:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'request for number of items before section 7 when there are only 1 sections in the collection view'
有没有人对我为什么会收到这个特定错误有任何想法。我所做的任何搜索似乎都指向类似的错误,但不是这个确切的错误。任何人都非常感激的任何想法。
谢谢。
- - 更新
我应该提到我正在手势识别器中执行此操作,因为这现在似乎很重要。我已经提取了代码并添加了一个按钮来运行它。用按钮运行它似乎有效(除了动画关闭),但做手势仍然给我错误。
代码如下:
[self.collectionView performBatchUpdates:^{
NSString *selectedMarketSector = [[[[_allMarketSectors objectAtIndex:stacksLayout.pinchedStackIndex] clients] objectAtIndex:0] clientMarketSector];
NSMutableArray* removeObjects = [[NSMutableArray alloc] init];
NSMutableIndexSet *removeSections = [[NSMutableIndexSet alloc] init];
for (TBMarketSector* sector in _marketSectors) {
if (![[[[sector clients] objectAtIndex:0] clientMarketSector ] isEqualToString:selectedMarketSector]) {
[removeObjects addObject:sector];
[removeSections addIndex:[_marketSectors indexOfObject:sector]];
}
}
[_marketSectors removeObjectsInArray:removeObjects];
[self.collectionView deleteSections:removeSections];
} completion:^(BOOL finished) {
[self setLayoutStyle:TBLayoutGrid animated:YES];
}];
--- 更新 2
我终于发现,在我从集合视图和模型中删除项目后,我的第一个自定义布局仍在尝试布局项目。我首先必须通过将收缩堆栈索引设置回 -1 来停止布局:
[stacksLayout setPinchedStackIndex:-1];
这样堆栈布局中的代码将停止尝试布局项目:
- (void)setPinchedStackIndex:(NSInteger)pinchedStackIndex
{
_pinchedStackIndex = pinchedStackIndex;
BOOL wasPinching = self.isPinching;
[self setPinching:pinchedStackIndex >= 0];
if (self.isPinching != wasPinching)
{
if (self.isPinching)
self.gridLayout = [[GridLayout alloc] init];
else
self.gridLayout = nil;
}
[self invalidateLayout];
}
所以我的代码现在如下所示:
[self.collectionView performBatchUpdates:^{
NSString *selectedMarketSector = [[[[_marketSectors objectAtIndex:stacksLayout.pinchedStackIndex] clients] objectAtIndex:0] clientMarketSector];
[stacksLayout setPinchedStackIndex:-1];
NSMutableArray* removeObjects = [[NSMutableArray alloc] init];
NSMutableIndexSet *removeSections = [[NSMutableIndexSet alloc] init];
for (TBMarketSector* sector in _marketSectors) {
if (![[[[sector clients] objectAtIndex:0] clientMarketSector ] isEqualToString:selectedMarketSector]) {
[removeObjects addObject:sector];
[removeSections addIndex:[_marketSectors indexOfObject:sector]];
}
}
[_marketSectors removeObjectsInArray:removeObjects];
[self.collectionView deleteSections:removeSections];
} completion:^(BOOL finished) {
[self setLayoutStyle:TBLayoutGrid animated:YES];
}];
现在这给了我一个单独的问题,我想我应该单独记录,但本质上,当我捏出一个堆栈时,堆栈布局将所有项目很好地排列在一个临时网格中,但是当它将布局切换到网格布局时,它们瞬间弹回堆栈并再次作为网格返回。
我想这又回到了我最初的问题,即从一种布局切换到另一种布局的正确方法是什么——iPad上的照片应用程序似乎完全切换了视图,但似乎没有“跳转”从一个布局到下一个布局,即使有一个捏手势。
感谢任何人都可以提供的任何其他信息。