UICollectionViewのカスタムレイアウトオブジェクトで問題が発生しています。アイテムを挿入すると、次のようNSInternalInconsistencyException
にスローされます。
2012-11-16 10:01:18.920 MyApp [4520:430b] *-[NSIndexPath行]でのアサーションの失敗、/ SourceCache / UIKit / UIKit-2372 / UITableViewSupport.m:2680 2012-11-16 10:01:18.924 MyApp [4520:430b]キャッチされなかった例外'NSInternalInconsistencyException'が原因でアプリを終了しています。理由:'UITableViewで使用するインデックスパスが無効です。テーブルビューに渡されるインデックスパスには、セクションと行を指定する2つのインデックスが含まれている必要があります。可能であれば、UITableView.hのNSIndexPathのカテゴリを使用してください。* *まずスローコールスタック:(0x370282a3 0x33eb097f 0x3702815d 0x347d72af 0x338c29bb 0x33cb8e1f 0x33ca95db 0x9cff9 0x33ca44b5 0x33ca5e73 0x33ca4295 0x33ca69d9 0x9a0a9 0xa554f 0x34797539 0x3478edb9 0x348073db 0x360cb11f 0x360cf961 0x360cfac1 0x36dd3a11 0x36dd38a4)のlibc ++ abi.dylib:例外をスロー呼ばTERMINATE
挿入を開始するコードは次のとおりです。
GetItemsRequest *request = [[GetItemsRequest alloc] init];
self.activeConnection = [[ServiceConnection alloc] initWithRequest:request
completion:^(GetItemsResponse *response, NSError *error) {
[self.collectionView performBatchUpdates:^{
[self.items addObjectsFromArray:response.items];
NSMutableArray *newIndexPaths = [NSMutableArray array];
for (Item *item in response.items)
{
[newIndexPaths addObject:[NSIndexPath indexPathForItem:[self.items indexOfObject:item]
inSection:0]];
}
[self.collectionView insertItemsAtIndexPaths:newIndexPaths];
} completion:NULL];
[self.pullRefreshView refreshLastUpdatedDate];
[self.pullRefreshView scrollViewDataSourceDidFinishedLoading:self.collectionView];
self.activeConnection = nil;
}];
[self.activeConnection start];
このコードは、カスタムレイアウトオブジェクトをオブジェクトに置き換えると機能するUICollectionViewFlowLayout
ので、正しいと思います。カスタムレイアウトは、単に呼び出すだけ[self.collectionView reloadData]
で機能するため、レイアウトオブジェクトが挿入を処理する方法に問題があるはずです。
クラッシュは次の呼び出しで発生しますsuper
:
- (void)prepareForCollectionViewUpdates:(NSArray *)updateItems
{
[super prepareForCollectionViewUpdates:updateItems];
for (UICollectionViewUpdateItem *item in updateItems)
{
if (item.updateAction == UICollectionUpdateActionDelete)
{
_items--;
}
else if (item.updateAction == UICollectionUpdateActionInsert)
{
_items++;
}
}
_rows = -1;
}
しかし、の説明を印刷するとupdateItems
、実際には、すべてのインデックスパスに2つのインデックスがあります。
<__NSArrayM 0x1f06af20>( <UICollectionViewUpdateItem: 0x1ddc2360> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc1eb0> 2 indexes [0, 0]) action (insert), <UICollectionViewUpdateItem: 0x1ddc23d0> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc1f00> 2 indexes [0, 1]) action (insert), <UICollectionViewUpdateItem: 0x1ddc23f0> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc1f20> 2 indexes [0, 2]) action (insert), <UICollectionViewUpdateItem: 0x1ddc2410> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc1f50> 2 indexes [0, 3]) action (insert), <UICollectionViewUpdateItem: 0x1ddc2430> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc1f80> 2 indexes [0, 4]) action (insert), <UICollectionViewUpdateItem: 0x1ddc2470> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc1e00> 2 indexes [0, 5]) action (insert), <UICollectionViewUpdateItem: 0x1ddc2490> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc1e20> 2 indexes [0, 6]) action (insert), <UICollectionViewUpdateItem: 0x1ddc24b0> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc1fe0> 2 indexes [0, 7]) action (insert), <UICollectionViewUpdateItem: 0x1ddc24d0> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc2010> 2 indexes [0, 8]) action (insert), <UICollectionViewUpdateItem: 0x1ddc2450> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc1fb0> 2 indexes [0, 9]) action (insert), <UICollectionViewUpdateItem: 0x1ddc2530> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc2090> 2 indexes [0, 10]) action (insert), <UICollectionViewUpdateItem: 0x1ddc2550> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc20c0> 2 indexes [0, 11]) action (insert), <UICollectionViewUpdateItem: 0x1ddc2570> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc20f0> 2 indexes [0, 12]) action (insert), <UICollectionViewUpdateItem: 0x1ddc2590> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc2120> 2 indexes [0, 13]) action (insert), <UICollectionViewUpdateItem: 0x1ddc25b0> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc2150> 2 indexes [0, 14]) action (insert), <UICollectionViewUpdateItem: 0x1ddc25d0> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc2180> 2 indexes [0, 15]) action (insert), <UICollectionViewUpdateItem: 0x1ddc25f0> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc21b0> 2 indexes [0, 16]) action (insert), <UICollectionViewUpdateItem: 0x1ddc2680> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc2250> 2 indexes [0, 17]) action (insert), <UICollectionViewUpdateItem: 0x1ddc26a0> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc2280> 2 indexes [0, 18]) action (insert), <UICollectionViewUpdateItem: 0x1ddc26c0> index path before update ((null)) index path after update (<NSIndexPath 0x1ddc22b0> 2 indexes [0, 19]) action (insert) )
では、なぜこのコードは、正確に2つのインデックスが必要であるという例外をスローするのでしょうか。どんな助けでも大歓迎です。