Почему происходит сбой моего приложения при добавлении строки вставки в представление таблицы? - PullRequest
3 голосов
/ 01 марта 2011

Я пытаюсь добавить строку с элементом управления вставкой (зеленый плюс) в представление таблицы, когда пользователь нажимает кнопку редактирования.Пока что у меня есть строка вставки для отображения, но если пользователь пытается прокрутить табличное представление, когда оно находится в режиме редактирования, приложение вылетает со следующей ошибкой:

* Завершение работы приложения из-за необработанного исключения «NSRangeException», причина: «* - [_ PFArray objectAtIndex:]: index (9) за пределами (9)»

Я знаю, что Подобный вопрос задавался и раньше, но, поскольку я новичок в программировании, мне, возможно, понадобится немного больше рук.Ответ на этот вопрос предложил убедиться, что numberOfRowsInSection корректно обновляется.Я думаю, что это так, но я, очевидно, где-то совершаю ошибку.

Это то, что я до сих пор получил в моем контроллере табличного представления, который является корневым контроллером представления для моего UINavigation Controller.На данный момент это просто фиктивная таблица - ничего не подключено, кроме кнопки редактирования.

#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 ]

3 голосов
/ 01 марта 2011

части вашего tableView:cellForRowAtIndexPath: метода неверны

Представьте, что ваш просмотр таблицы находится в режиме редактирования. и у вас есть 10 объектов в _trips.

Вы говорите табличному представлению, что у вас есть 11 строк в массиве:

if (tableView.editing) rows++;

И просмотр таблицы попытается получить доступ к элементу с индексом 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;
}

и кстати. if (indexPath.row == !0) делает что-то отличное от if (indexPath.row != 0)

0 голосов
/ 01 марта 2011

Это означает, что количество строк, которые вы храните в массиве, является проблемой.Просьба проверить массив.Сбой из-за того, что общее количество элементов в массиве превысило пределы массива

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...