2

我正在使用一个集合视图,我试图从一个集合视图布局切换到另一个使用:

[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];
}

这是来自 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上的照片应用程序似乎完全切换了视图,但似乎没有“跳转”从一个布局到下一个布局,即使有一个捏手势。

感谢任何人都可以提供的任何其他信息。

4

0 回答 0