2013-09-14 2 views
0

Мое приложение падает, когда я пытаюсь вставить новую запись. Ранее я получил эту ошибку, и я не смог ее исправить. Может ли кто-нибудь помочь?Столбец сталкивается при попытке вставить

Вот моя ошибка отображается в консоли:

2013-09-14 15:41:00.370 Probation App[9919:907] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]' 
*** First throw call stack: 
(0x31fe82a3 0x39ccc97f 0x31f33b75 0xd7b81 0x33eb228d 0x33f34f81 0x328f6277 0x31fbd5df 0x31fbd291 0x31fbbf01 0x31f2eebd 0x31f2ed49 0x35af62eb 0x33e44301 0x542fd 0x3a103b20) 
libc++abi.dylib: terminate called throwing an exception 

и вот мой код:

#pragma mark UITableViewDataSource Methods 

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:@"cell"]; 
    if(nil == cell) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier:@"cell"]; 
    } 
    if (indexPath.row <self.probationers.count) 
    { 
     Probationer *thisProbationer = [self.probationers objectAtIndex:indexPath.row]; 
     cell.textLabel.text = thisProbationer.probationerName; 
     cell.detailTextLabel.text = thisProbationer.probationerID; 
    } 
    else 
    { 
     cell.textLabel.text = @"Add Probationer"; 
     cell.textLabel.textColor = [UIColor lightGrayColor]; 
     cell.editingAccessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    } 

    return cell; 
} 

-(NSInteger)tableView: (UITableView *)tv numberOfRowsInSection:(NSInteger)section 
{ 

    NSInteger count = self.probationers.count; 
    if(self.editing) 
    { 
     count = count +1; 
    } 

    return count; 

    //return [self.probationers count]; 
} 

//Deleting an Entry 

-(void) tableView:(UITableView *)tv commitEditingStyle:(UITableViewCellEditingStyle) editing forRowAtIndexPath: (NSIndexPath *) indexPath 
{ 
    if (editing == UITableViewCellEditingStyleDelete) 
    { 
     [self.probationers removeObjectAtIndex:indexPath.row]; 
     [tv deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft]; 
    } 
} 

#pragma mark UITableViewDelegate Methods 

-(void)tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    Probationer *chosenProbationer = [self.probationers objectAtIndex:indexPath.row]; 
    ProbationerController *detailedViewController = [[ProbationerController alloc]init]; 
    detailedViewController.delegate = self; 
    detailedViewController.currentProbationer = chosenProbationer; 

    if (indexPath.row <self.probationers.count && !self.editing) 
    { 

     [self.navigationController pushViewController:detailedViewController animated:YES]; 
    } 
    if (indexPath.row == self.probationers.count && self.editing) 
    { 

     AddProbationerController *addProbationer = [[AddProbationerController alloc] init]; 
     [self.navigationController pushViewController:addProbationer animated:YES]; 
    } 

    [tv deselectRowAtIndexPath:indexPath animated:YES]; 

    //selectedIndexPath = indexPath; 



    //[self.navigationController pushViewController:detailedViewController animated:YES]; 

} 
+0

Почему вы возвращаете count = count +1; когда вы редактируете? Я думаю, это твоя проблема. – rdelmar

+0

Я думал, что это может иметь какое-то отношение к этому ... Знаете ли вы, что мне нужно сделать, чтобы исправить это? –

+0

Удалить предложение if и просто вернуть [self.probationers count]. – rdelmar

ответ

1

Количество строк всегда должны исходить от источника данных (бит вы комментировали out //return [self.probationers count];). Не пытайтесь просто добавить номер. Добавьте в источник данных, а затем обновите представление таблицы.

+0

Я раскопал линию, но она все еще не работает. Появится одно и то же сообщение об ошибке. Нужно ли мне что-то делать? –

+0

Удалите 'count = count + 1'. Где вы на самом деле редактируете «испытателей»? – Wain

+0

Я удалил его, но появляется другая ошибка, как только я перехожу в режим редактирования: причина: «попытаться вставить строку 2 в раздел 0, но есть только 2 строки в разделе 0 после обновления» –

0

Трассировка стека говорит все. Его определенно из-за вас self.probationers массив.

Почему вы не NSLog количество элементов в массиве и количество строк/разделов в вашем представлении таблицы. Когда вы пытаетесь связать indexPath.row и self.probationers, вы должны убедиться, что они соответствуют количеству элементов.

следовать также основам при доступе к элементам массива (как они очень подвержены получить исключение)

  • Nil проверить массив обращающегося за доступ.
  • Знайте точное количество массива, регистрируясь.
  • Убедитесь, что вы пытаетесь получить доступ к любым объектам, превышающим доступные индексы массива.
Смежные вопросы