我正在使用集合视图,我正在尝试使用以下方法从一个集合视图布局切换到另一个:
[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];
}
这来自示例代码from Mark Pospesel
所以我的代码现在看起来如下:
[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上的照片应用程序似乎完全切换了视图,但似乎没有“跳”从一个布局到下一个布局,即使例如有一个捏合手势。
感谢任何人提供的任何其他信息。