Вставка строки при проблемах пути индекса - PullRequest
2 голосов
/ 26 января 2012

Я создаю приложение для 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;
}

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

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

Ответы [ 4 ]

2 голосов
/ 26 января 2012

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

1 голос
/ 29 сентября 2014

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

- (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 голосов
/ 29 сентября 2014

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

Например, если у вас есть один элемент в _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];
0 голосов
/ 26 января 2012

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

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

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

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