2012-10-22 72 views
0

我集成GrabKit在我的iPhone應用程序,這是一個圖書館從社交網絡抓取照片。現在,我有以下的情況/問題:NSInternalInconsistencyException與UITableViewController和故事板流行

我有一個UITableViewController - AlbumListViewController。 然後還有一個UITableViewCell - AlbumCellViewController。 當你點擊其中一個單元格 - 包含照片的相冊 有一個UITableViewController - PhotoListViewController 和一個UITableViewCell - PhotoCellViewController。

這裏的一切工作只是finde,我可以瀏覽相冊,選擇一個,瀏覽其中的照片,然後當我選擇單張照片之一時,有一個PushViewController到我的SetPhotoViewController,它以全屏顯示所選圖像。

現在,當我想用​​我的導航欄的後退按鈕在SetPhotoViewController,以下消息的崩潰:我的兩個UITableViewControllers的

*** Assertion failure in -[UISectionRowData refreshWithSection:tableView:tableViewRowData:], /SourceCache/UIKit_Sim/UIKit-2372/UITableViewRowData.m:400 
2012-10-22 22:49:32.814 Amis[1820:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Failed to allocate data stores for 1073741821 rows in section 1. Consider using fewer rows' 
*** First throw call stack: 
(0x23de012 0x1b63e7e 0x23dde78 0x15f9f35 0xc8f83b 0xc923c4 0xb56fa2 0xb5692c 0x1690f 0x1cd653f 0x1ce8014 0x1cd87d5 0x2384af5 0x2383f44 0x2383e1b 0x2a9a7e3 0x2a9a668 0xaab65c 0x42fd 0x2b75) 
libc++abi.dylib: terminate called throwing an exception 

數據源和代表都設置爲文件的所有者。

當我通過代碼調試時,我找不到任何特殊的東西,所有的照片都可以加載,所有的數組都充滿了數據,沒有什麼奇怪的。

這裏是PhotoListViewController的兩個函數被調用,只要我按在我的NavigationController後退按鈕:

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    UITableViewCell *cell = nil; 
    NSLog(@"%i", indexPath.row); 
    NSLog(@"%ii", indexPath.section); 
    // Extra Cell 
    if (indexPath.section > _lastLoadedPageIndex){  

     static NSString *extraCellIdentifier = @"ExtraCell"; 

     cell = [tableView dequeueReusableCellWithIdentifier:extraCellIdentifier]; 
     if (cell == nil) { 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:extraCellIdentifier]; 
     } 

     cell.textLabel.text = @"load more"; 
     cell.textLabel.font = [UIFont fontWithName:@"System" size:8]; 



    } else { 

     static NSString *photoCellIdentifier = @"photoCell"; 

     cell = [tableView dequeueReusableCellWithIdentifier:photoCellIdentifier]; 
     if (cell == nil) { 

      cell = [[[NSBundle mainBundle] loadNibNamed:@"PhotoRowViewController" owner:self options:nil] objectAtIndex:0]; 
     } 


    }  

    // setting of the cell is done in method [tableView:willDisplayCell:forRowAtIndexPath:] 

    return cell; 
} 

和..

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // extra cell 
    if ([cell.reuseIdentifier isEqualToString:@"ExtraCell"]){ 

     if (state == GRKDemoPhotosListStateAllPhotosGrabbed) { 

      cell.textLabel.text = [NSString stringWithFormat:@" %d photos", [[_album photos] count] ]; 

     }else { 
      cell.textLabel.text = [NSString stringWithFormat:@"Loading page %d", _lastLoadedPageIndex+1]; 
      [self fillAlbumWithMorePhotos]; 
     } 


    } else // Photo cell 
    { 
     NSArray * photosAtIndexPath = [self photosForCellAtIndexPath:indexPath]; 

     [(PhotoRowViewController*)cell setPhotos:photosAtIndexPath]; 


    } 

} 

我缺少什麼?

編輯:numberOfRowsInSection-方法的代碼: 如果我調試它,第一時間RES等於0,第二個時間的方法被調用,解析度是等於。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // Return the number of rows in the section. 

    NSUInteger res = 0; 

    if (state == GRKDemoPhotosListStateAllPhotosGrabbed && section == _lastLoadedPageIndex) { 

     NSUInteger photosCount = [_album count]; 

     // Number of cells with kNumberOfPhotosPerCell photos 
     NSUInteger numberOfCompleteCell = (photosCount - section*kNumberOfRowsPerSection*kNumberOfPhotosPerCell)/kNumberOfPhotosPerCell; 

     // The last cell can contain less than kNumberOfPhotosPerCell photos 
     NSUInteger thereIsALastCellWithLessThenFourPhotos = (photosCount % kNumberOfPhotosPerCell)?1:0; 

     // always add an extra cell 
     res = numberOfCompleteCell + thereIsALastCellWithLessThenFourPhotos +1 ; 


    } else if (section > _lastLoadedPageIndex) { 

     // extra cell 
     res = 1; 

    } else res = kNumberOfRowsPerSection; 


    return res; 

} 
+0

我們真正需要看到的是'我聯繫 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section' – CodaFi

+0

添加了上面的方法,謝謝你,@CodaFi :) – NthDegree

回答

5

我是GrabKit的開發者。感謝您使用它:)

實際上,GrabKit中的控制器僅用於演示目的,它們不是爲了在項目中「按原樣」使用而設計的,更具體地說:GRKDemoPhotosList控制器不具備另一個控制器推入控制器層次結構。

所以,你需要的是一點點修復,使grabKit演示的控制器適合你的項目:)

我想這個問題是這樣的:

_在[GRKDemoPhotosList viewWillAppear中],該方法fillAlbumWithMorePhotos叫做。

_當你從你的控制器回彈到GRKDemoPhotosList時,這個方法被再次調用,並且它會產生這個錯誤。

嘗試在viewWillAppear方法中添加一個標誌,以避免調用fillAlbumWithMorePhotos兩次,我想它會正常工作。

歡迎通過郵件(pierre.olivier.simonard在gmail.com),或在twitter(@pierrotsmnrd)如果你需要更多的信息或幫助:)

+0

你,皮埃爾奧利維爾西蒙納爵士,是我的英雄!它現在的作品:)非常感謝你給我這個建議,並非常感謝你開發這個真棒框架GrabKit。我花了很多時間去尋找和找到這樣一個Lib,但是我找不到合適的Lib,如果我找到了一個,我就無法工作,因爲它很複雜。世界需要像你這樣的開發者! :) – NthDegree

+0

非常感謝這麼好的評論,我很高興:D –

+0

請給我更多關於您的應用程序的電子郵件/ Twitter的細節,你需要的改進等:)我想聽聽更多來自使用GrabKit的開發者:) –

相關問題