我在我的iPhone-App中集成了GrabKit,这是一个从社交网络中获取照片的图书馆。现在我有以下情况/问题:
我有一个UITableViewController - AlbumListViewController。 然后是一个UITableViewCell - AlbumCellViewController。 当您点击其中一个单元格 - 带有照片的相册时 有一个UITableViewController - PhotoListViewController 和一个UITableViewCell - PhotoCellViewController。
这里的所有内容都可以正常使用,我可以浏览相册,选择一个,浏览其中的照片,然后当我选择其中一张照片时,我的SetPhotoViewController上有一个PushViewController,它会在全屏显示所选图像。 / p>
现在,当我想在SetPhotoViewController中使用导航栏的后退按钮时,崩溃时会显示以下消息:
*** 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
我的两个UITableViewControllers的DataSource和Delegate都设置为File的所有者。
当我调试代码时,我找不到任何特殊的东西,所有的照片都可以加载,所有的数组都填充了数据,没有什么奇怪的。
一旦我按下NavigationController上的后退按钮,就会调用PhotoListViewController的两个函数:
(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-Method的代码: 如果我调试它,第一次res等于0,第二次调用该方法时,res等于 322121535 。
- (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 :(得分:5)
我是GrabKit的开发者。感谢您使用它:)
实际上,GrabKit中的控制器仅用于演示目的,它们不是设计为在项目中“按原样”使用,更具体地说:GRKDemoPhotosList控制器没有在控制器层次结构中推送另一个控制器
所以你需要的只是一点点修复,让grabKit demo的控制器适合你的项目:)
我猜问题如下:
在[GRKDemoPhotosList viewWillAppear]中_,调用fillAlbumWithMorePhotos方法。
_当你从控制器弹回到GRKDemoPhotosList时,再次调用此方法,它会生成此错误。
尝试在viewWillAppear方法中添加一个标志,以避免两次调用fillAlbumWithMorePhotos,我猜它会正常工作。
如果您需要更多信息或帮助,请随时通过邮件(pierre.olivier.simonard at gmail.com)或twitter(@pierrotsmnrd)与我联系:)