当我向表格视图添加插入行时,为什么我的应用程序崩溃了?

时间:2011-03-01 12:28:31

标签: ios iphone uitableview cocoa-touch crash

我正在尝试在用户按下编辑时向表格视图添加一个带插入控件(绿色加号)的行。到目前为止,我已经显示了插入行,但是如果用户在编辑模式下尝试滚动表视图,则应用程序崩溃时出现以下错误:

  

*由于未捕获的异常'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

谢谢!

2 个答案:

答案 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)

这意味着您在数组中存储的行数是问题。请检查阵列。崩溃是因为数组的元素总数超过了数组的限制