Xcode4:由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序

时间:2012-07-30 19:55:49

标签: iphone objective-c ios5 xcode4

我在xcode4中使用iphone模拟器获得此异常:

Terminating app due to uncaught exception 'NSInternalInconsistencyException'

如果在cellForRowAtIndex方法中没有返回任何对象(返回0),似乎会导致这种情况。但是我已经准备好返回牢房了。

任何人都可以看到可能导致此错误的原因吗?这是一系列截图:

控制器配置: My Controller configuration

原型细胞 prototype cell 1

attentionCell: enter image description here

故事板: Full view of the storyboards

完全错误:

**Assertion failure in -[UITableView 
_createPreparedCellForGlobalRow:withIndexPath:],           
/SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:6061
2012-07-30 14:34:16.660 Simple Storyboard[263:f803] Terminating app due 
to uncaught exception 'NSInternalInconsistencyException', 
reason: 'UITableView dataSource must return a cell from 
tableView:cellForRowAtIndexPath:'**

以下是代码:

#import "LWWBidTaskListController.h"

@interface LWWBidTaskListController ()
@property (strong, nonatomic)NSArray *tasks;

@end

@implementation LWWBidTaskListController

@synthesize tasks;

- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
    // Custom initialization
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];

self.tasks = [NSArray arrayWithObjects: @"Walk the dog", @"URGENT:Buy milk", @"Clean     hidden lair", @"Invent miniature dolphins", @"Find new henchmen", @"Get revenge on do-gooder heroes", @"URGENT: Fold laundry", @"Hold entire hold hostage", @"Manicure", nil];

// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;

// Uncomment the following line to display an Edit button in the navigation bar for this     view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.tasks = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:    (UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
//#warning Potentially incomplete method implementation.
// Return the number of sections.
//return 0;
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//#warning Incomplete method implementation.
// Return the number of rows in the section.
//return 0;
return [tasks count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:    (NSIndexPath *)indexPath//populates each cell
{
//static NSString *CellIdentifier = @"Cell";
//UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];


NSString *identifier = nil;
NSString *task = [self.tasks objectAtIndex:indexPath.row];
NSRange urgentRange = [task rangeOfString:@"URGENT"];
if (urgentRange.location == NSNotFound)
{
    identifier = @"plainCell";
}
else 
{
    identifier = @"attentionCell";
}
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

// Configure the cell...

UILabel *cellLabel = (UILabel *)[cell viewWithTag:1];
cellLabel.text = task;

return cell;
}

该错误意味着什么,我该如何解决?

2 个答案:

答案 0 :(得分:2)

看起来好像你从未创建过一个单元格。如果你从未分配和初始化一个单元格,那么就没有任何一个单元格出列。 在//配置单元格..行之前,您需要检查可重用单元格是否已出列,如果没有,请创建一个如下:

if (cell == nil) {
  cell = [[UITableViewCell alloc]  initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

  // Configure common elements here

}

  // Now go on to configure specific elements for this row

在使用故事板时,您可能没有正确设置原型单元属性。标识符必须与上述方法中的标识符相匹配。

请参阅此图片,了解原型单元属性Prototype cell setup的位置。它来自本教程,也可以帮助您Ray Wenderlich and Storyboards

答案 1 :(得分:1)

我想你的第二个原型单元必须成为故事板中tableView的一部分,现在它只是同一场景的一部分 - 这可能就是为什么你没有了。

无论如何都试着:

NSLog(@"current cell: %@ -> %@", identifier, cell);

并检查dequeueReusableCellWithIdentifier:正在返回的内容。


只需将attentionCell拖放到表格视图中即可 ..