我正在尝试在用户按下编辑时向表格视图添加一个带插入控件(绿色加号)的行。到目前为止,我已经显示了插入行,但是如果用户在编辑模式下尝试滚动表视图,则应用程序崩溃时出现以下错误:
*由于未捕获的异常'NSRangeException'而终止应用程序,原因:'* - [_ PFArray objectAtIndex:]:index(9)超出边界(9)'
我知道之前已经问过similar question,但由于我是编程新手,我可能需要更多的支持。该问题的答案建议确保numberOfRowsInSection正确更新。我认为我的是,但我显然在某个地方犯了错误。
这是我目前在我的表视图控制器中所拥有的,它是我的UINavigation控制器的根视图控制器。目前它只是一个虚拟表 - 除了编辑按钮之外没有任何东西可以连接。
#import "RootViewController.h"
#import "AppDelegate_iPhone.h"
#import "Trip.h"
@implementation RootViewController
@synthesize trips = _trips;
@synthesize context = _context;
- (id)init
{
self = [super init] ;
if (self)
{
automaticEditControlsDidShow = NO;
}
return self ;
}
- (void)viewDidLoad {
[super viewDidLoad];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Trip" inManagedObjectContext:_context]];
NSError *error;
self.trips = [_context executeFetchRequest:fetchRequest error:&error];
self.title = @"Trips";
[fetchRequest release];
// Display an Edit button for this view controller.
self.navigationItem.rightBarButtonItem = self.editButtonItem;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
int rows = [_trips count];
if (tableView.editing) rows++;
return rows;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
// Configure the cell...
Trip *info = [_trips objectAtIndex:indexPath.row];
if (tableView.editing)
{
if (indexPath.row == 0)
cell.textLabel.text = @"Add New Trip";
if (indexPath.row == !0)
cell.textLabel.text = info.tripName;
}
else
{
cell.textLabel.text = info.tripName;
}
return cell;
}
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
int row = indexPath.row;
if (self.editing && row == 0) {
if (automaticEditControlsDidShow)
return UITableViewCellEditingStyleInsert;
return UITableViewCellEditingStyleDelete;
}
return UITableViewCellEditingStyleDelete;
}
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
automaticEditControlsDidShow = NO;
[super setEditing:editing animated:animated];
NSArray *addRow = [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:0 inSection:0],nil];
[self.tableView beginUpdates];
if (editing) {
automaticEditControlsDidShow = YES;
[self.tableView insertRowsAtIndexPaths:addRow withRowAnimation:UITableViewRowAnimationLeft];
} else {
[self.tableView deleteRowsAtIndexPaths:addRow withRowAnimation:UITableViewRowAnimationLeft];
}
[self.tableView endUpdates];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)viewDidUnload {
}
- (void)dealloc {
[_trips release];
[_context release];
[super dealloc];
}
@end
谢谢!
答案 0 :(得分:3)
部分tableView:cellForRowAtIndexPath:
方法错误
想象一下你的tableview处于编辑模式。并且_trips中有10个对象。
你告诉tableview你在数组中有11行:
if (tableView.editing) rows++;
tableview将尝试访问索引为10的元素:
Trip *info = [_trips objectAtIndex:indexPath.row];
但是你没有索引为10的元素。所以你会得到一个异常
您必须更改为您提供数组索引的逻辑。也许是这样的
if (tableView.editing)
{ // tableview row count is _trips count + 1
if (indexPath.row == 0)
cell.textLabel.text = @"Add New Trip";
if (indexPath.row != 0) {
// realIndex = table view index - 1
Trip *info = [_trips objectAtIndex:indexPath.row - 1];
cell.textLabel.text = info.tripName;
}
}
else
{
Trip *info = [_trips objectAtIndex:indexPath.row];
cell.textLabel.text = info.tripName;
}
和btw。 if (indexPath.row == !0)
执行与if (indexPath.row != 0)
答案 1 :(得分:0)
这意味着您在数组中存储的行数是问题。请检查阵列。崩溃是因为数组的元素总数超过了数组的限制