phi*_*hil 18 iphone core-data uitableview
我有一个简单的UITableviewController以前工作正常,现在有些事情已经破坏了它.它提供了一个简单的表单,允许我向核心数据管理对象添加一个简单的3字段记录.
当我添加记录时,它应该返回到表并显示内容.我可以看到它正在将记录写入数据库,但该表为空,并显示以下错误.我可以通过单击"添加"按钮继续添加记录,但每次保存新记录并返回到表时,它都是空的.
我看到的完整错误就是这个..
*** Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit_Sim/UIKit-1448.89/UITableView.m:5678
2011-10-01 22:48:11.860 Gradetrack[59617:207] Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath: with userInfo (null)
Run Code Online (Sandbox Code Playgroud)
如果我停止模拟器并重新启动它,我可以从我的NSLog语句中看到它已从数据库中发现了正确数量的记录并尝试加载表但是此时,我得到了类似的错误和下面的堆栈跟踪.
2011-10-01 23:08:50.332 Gradetrack[59795:207] >>> Enumber of courses entered thus far: 4
2011-10-01 23:08:50.334 Gradetrack[59795:207] *** Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit_Sim/UIKit-1448.89/UITableView.m:5678
2011-10-01 23:08:50.337 Gradetrack[59795:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'
*** Call stack at first throw:
(
0 CoreFoundation 0x00fd05a9 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x01124313 objc_exception_throw + 44
2 CoreFoundation 0x00f88ef8 +[NSException raise:format:arguments:] + 136
3 Foundation 0x000e43bb -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
4 UIKit 0x0035ec91 -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 883
5 UIKit 0x003544cc -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75
6 UIKit 0x003698cc -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1561
7 UIKit 0x0036190c -[UITableView layoutSubviews] + 242
8 QuartzCore 0x01f70a5a -[CALayer layoutSublayers] + 181
9 QuartzCore 0x01f72ddc CALayerLayoutIfNeeded + 220
10 QuartzCore 0x01f180b4 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310
11 QuartzCore 0x01f19294 _ZN2CA11Transaction6commitEv + 292
12 UIKit 0x002eb9c9 -[UIApplication _reportAppLaunchFinished] + 39
13 UIKit 0x002ebe83 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 690
14 UIKit 0x002f6617 -[UIApplication handleEvent:withNewEvent:] + 1533
15 UIKit 0x002eeabf -[UIApplication sendEvent:] + 71
16 UIKit 0x002f3f2e _UIApplicationHandleEvent + 7576
17 GraphicsServices 0x01928992 PurpleEventCallback + 1550
18 CoreFoundation 0x00fb1944 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
19 CoreFoundation 0x00f11cf7 __CFRunLoopDoSource1 + 215
20 CoreFoundation 0x00f0ef83 __CFRunLoopRun + 979
21 CoreFoundation 0x00f0e840 CFRunLoopRunSpecific + 208
22 CoreFoundation 0x00f0e761 CFRunLoopRunInMode + 97
23 UIKit 0x002eb7d2 -[UIApplication _run] + 623
24 UIKit 0x002f7c93 UIApplicationMain + 1160
25 Gradetrack 0x00002034 main + 102
26 Gradetrack 0x00001fc5 start + 53
Run Code Online (Sandbox Code Playgroud)
基于NSLog语句,这是最后执行的子例程.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
NSLog(@">>> Enteringg %s [Line %d] ", __PRETTY_FUNCTION__, __LINE__);
id <NSFetchedResultsSectionInfo> sectionInfo =
[[_fetchedResultsController sections] objectAtIndex:section];
NSLog(@">>> Enumber of courses entered thus far: %d ", [sectionInfo numberOfObjects]);
return [sectionInfo numberOfObjects];
}
Run Code Online (Sandbox Code Playgroud)
注意:到目前为止输入的课程数量的输出是4,这是正确的.
这是我将单元格返回给UITableViewController的地方
- (UITableViewCell *)tableView:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath {
NSLog(@">>> Entering %s [Line %d] ", __PRETTY_FUNCTION__, __LINE__);
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell =
[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:CellIdentifier] autorelease];
}
// Set up the cell...
[tableView setAllowsSelectionDuringEditing:NO];
[self configureCell:cell atIndexPath:indexPath];
// load the cell with an appropriate image
NSString *path = [[NSBundle mainBundle] pathForResource:@"studentprofile" ofType:@"png"];
UIImage *theImage = [UIImage imageWithContentsOfFile:path];
cell.imageView.image = theImage;
return cell;
}
Run Code Online (Sandbox Code Playgroud)
基于这些错误和我的堆栈跟踪,任何人都能指出我正确的方向吗?
非常感谢,
菲尔
Joe*_*nni 18
我刚遇到同样的问题,但我不小心宣布:
<UITableViewDelegate, UITableViewDelegate>
Run Code Online (Sandbox Code Playgroud)
而不是正确:
<UITableViewDelegate, UITableViewDataSource>
Run Code Online (Sandbox Code Playgroud)
乔
*更新 - 我还注意到在xCode 4.3中创建新的UITableViewController类时生成的模板缺少cellForRowAtIndexPath中的关键项.那是:
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
Run Code Online (Sandbox Code Playgroud)
好吧,抱歉,出现问题警报。
我不确定这是如何发生的,但如果您在我的“cellForRowAtIndexPath”函数声明中注意到......它只有 atIndexPath 而不是 cellForRowAtIndexPath。我一定做了某种不明智的全局搜索和替换,它破坏了我的项目。
现在工作了。谢谢。
问题 - 为什么代码编译时没有错误或警告 - 哇 - 这花了太长时间才找到。