2013-06-27 88 views
3

有時我從viewForSupplementaryElementOfKind得到這個「索引0越過界限爲空陣列」的錯誤。它只是有時會發生,通常集合正常加載並且一切運行平穩。我不知道什麼數組是空的?註冊單元? (我試圖通過代碼或從接口生成器註冊它們,仍然沒有變化)viewForSupplementaryElementOfKind崩潰的「索引0越過空陣列的界限」

即時猜測,有時這種方法被稱爲太早在加載集合和缺乏一些尚未數據加載。

有人可以指點我嗎?

我的實現是非常簡單的: (我用的視點的右重用標識符)

- (UICollectionReusableView *)collectionView:(UICollectionView *)theCollectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)theIndexPath{ 
UICollectionReusableView *theView; 

if(kind == UICollectionElementKindSectionHeader) 
{ 
    theView = [theCollectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header" forIndexPath:theIndexPath]; 
} else { 
    theView = [theCollectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"footer" forIndexPath:theIndexPath]; 
} 

return theView;} 
+0

這仍然發生,任何人有任何想法爲什麼? –

+0

我hade同樣奇怪的probem - 只在ios7 - 修復它通過http://stackoverflow.com/questions/31974460/dequeuereusablesupplementaryviewofkind-crash-on-ios-7-1-index-0-beyond-bounds 和做通過委託 –

回答

-2

我仍然不知道這是爲什麼有時會崩潰,但似乎如果我的包裹這個代碼用try-catch塊,而是分配一個出列的視圖,那麼集合將繼續加載就好了..

if(kind == UICollectionElementKindSectionHeader) { 
    theView = [theCollectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header" forIndexPath:theIndexPath]; 
} 

變爲:

if(kind == UICollectionElementKindSectionHeader) 
{ 
    @try { 
     theView = [theCollectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header" forIndexPath:theIndexPath]; 
    } 
    @catch (NSException * e) { 
     NSLog(@"Exception: %@", e); 
     theView = [[UICollectionReusableView alloc] init]; 
    } 
    @finally { 
     return theView; 
    } 

} 

我知道它分配一個UICollectionReusableView不是一個好主意,但它的QUIK修復現在或直到我找到真正的問題。

+0

通過try/catch它也崩潰,因爲collectionView期望頭只能通過出隊檢索......並且沒有其他選擇。 – DisableR

1

長着這種碰撞玩弄後,我發現:

  • 導致崩潰,如果你是從筆尖加載您的收藏視圖NIB文件非零節頭大小在其流佈局已經設定。

  • 它不崩潰,如果你在你的筆尖文件大小爲零流式佈局節頭的設置,然後在viewDidLoad中適當設置:

    - (void)viewDidLoad 
    { 
        [super viewDidLoad]; 
    
        [self.collectionView registerNib:[UINib nibWithNibName:@"HeaderView" bundle:nil] 
         forSupplementaryViewOfKind:UICollectionElementKindSectionHeader 
         withReuseIdentifier:sHeaderViewIdentifier]; 
    
        [self.collectionView registerNib:[UINib nibWithNibName:@"Cell" bundle:nil] forCellWithReuseIdentifier:sCellIdentifier]; 
    
        UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout; 
        layout.headerReferenceSize = CGSizeMake(self.collectionView.bounds.size.width, 50.f); 
        [layout invalidateLayout]; 
    }