2012-01-25 2 views
2

Я создаю приложение iOS, которое настроено как иерархия данных. У меня нет проблем на первой странице, добавляя и удаляя объекты или даже переходя на следующую страницу. Проблема возникает на второй странице, которая настроена точно так же, как и первая. Когда я нажимаю кнопку добавления, чтобы добавить объект, программа вылетает и отправляет обратно ошибку SIGABRT.Вставка строки по причинам пути указателя

[self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:YES]; << crashes on this line 

здесь есть функция добавить постучала:

- (void)addTapped:(id)sender { 
    StudentDoc *newDoc = [[[StudentDoc alloc] initWithTitle:@"New Student" rating:0 thumbImage:nil fullImage:nil] autorelease]; 
    [_students addObject:newDoc]; 

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:_students.count-1 inSection:0]; 
    NSArray *indexPaths = [NSArray arrayWithObject:indexPath];  
    [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:YES]; 

    [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionMiddle]; 
    [self tableView:self.tableView didSelectRowAtIndexPath:indexPath]; 
} 

количество строк в разделе:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return _students.count; 
} 

Я был под впечатлением, что подсчет является то, что является причиной проблемы, но я контролировал счет, и он остается неизменным.

В целом я понятия не имею, почему он сбой в этот момент, потому что перед тем, как он использует одну и ту же функцию для добавления объектов на эту страницу. Есть идеи?

ответ

0

Я сделал почти то же самое, Тхо я разделить его на 2 строки:

NSInteger idx = [_students count] - 1; 
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:idx inSection:0]; 

Интересно, если это будет иметь значение.

+0

Это все еще дает мне ту же ошибку на вставленную строку с индексом пути – user1170015

+0

Вы можете поставить весь контент метода в '@try {...} @catch (NSException * e) {NSLog (@" exception% @ ", [e description]); } '? –

2

Обычно, если вы испортили свой массив или индексы строк, вы ожидаете, что исключение будет зарегистрировано на консоли, а не SIGABRT. Включили ли вы NSZombies и исключения для исключения в Xcode? Это может помочь диагностировать проблему.

1

Вы должны поместить строку вставки по пути индекса между начальными обновлениями и блоком завершения обновлений.

- (void)addTapped:(id)sender { 

    StudentDoc *newDoc = [[[StudentDoc alloc] initWithTitle:@"New Student" rating:0 thumbImage:nil fullImage:nil] autorelease]; 
    [_students addObject:newDoc]; 

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:_students.count-1 inSection:0]; 
    NSArray *indexPaths = [NSArray arrayWithObject:indexPath];  

    [self.tableView beginUpdates]; 
    [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:YES]; 
    [self.tableView endUpdates]; 

    [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionMiddle]; 
    [self tableView:self.tableView didSelectRowAtIndexPath:indexPath]; 

} 
0

Вы добавления объекта к источнику данных, но заменяя существующую строку в таблице, не добавив к нему один, в результате чего в одной строке в indexPath но 2 элементов в массиве источника данных.

Например, если у вас есть один элемент в _students, у вас будет один путь индекса, {0,0}. Когда вы добавляете строку, вы добавляете ее в indexPath {_students.count - 1, 0}, которая будет {1 - 1, 0} или {0, 0}. Ваш источник данных должен соответствовать любым вложенным или удаленным индексам, и в вашем случае вы всегда получаете еще один элемент в своем источнике данных, чем вы добавляете/удаляете.

Если вы всегда хотите добавить элемент, вместо:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:_students.count-1 inSection:0]; 

Вы хотите:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:_students.count inSection:0]; 
Смежные вопросы