UITableView reloadData не отображается правильно после удаления строки - PullRequest
0 голосов
/ 30 марта 2012

У меня есть этот код для UITableView с двумя столбцами, которые я нашел в Интернете. Он прекрасно работает всякий раз, когда я добавляю к нему еще одну строку, но когда я выбираю строку, которую нужно удалить, она просто удаляет последнюю строку. Я просто добавляю строки в конец массива с помощью [NSMutableArray addObject:], но когда я удаляю строку, сначала выбираю строку, которую нужно удалить.

здесь выбирается строка ------ (я проверил, что tableViewIdx был верным)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

   tableViewIdx = [indexPath row];
}

затем кнопка удаления ------ (я проверил, действительно ли объект был удален из массива)

-(IBAction)bt_DeletePressed:(id)sender{
    [mutableArray removeObjectAtIndex:tableViewIdx];
    //delete actual content
    for(int i = VStableViewIdx;i<10;i++){
        g_vitals[i] = g_vitals[i+1];
    }
    [TableView reloadData];
    tableViewIdx--;
}

и часть кода tableView

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
   int count = [listData count];
   if(self.editing) count++;
   tableSize = count;
   return count;
}

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

   NSString *MyIdentifier = [NSString stringWithFormat:@"MyIdentifier %i", indexPath.row];

   MyTableCell *cell = (MyTableCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];
   if (cell == nil){
       cell = [[[MyTableCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];

       NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
       [formatter setDateFormat:@"HH:mm"];

       UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(0.0, 0, 60.00,tableView.rowHeight)] autorelease];
       [cell addColumn:60];
       label.font = [UIFont systemFontOfSize:12.0];
       label.text = textView.text;
       [formatter release];
       label.textAlignment = UITextAlignmentRight;
       label.textColor = [UIColor blueColor];
       label.autoresizingMask = UIViewAutoresizingFlexibleRightMargin |
       UIViewAutoresizingFlexibleHeight;
       [cell.contentView addSubview:label]; 

       label =  [[[UILabel alloc] initWithFrame:CGRectMake(70.0, 0, 60.0,tableView.rowHeight)] autorelease];
       [cell addColumn:500];
       label.font = [UIFont systemFontOfSize:12.0];
       label.text = [NSString stringWithFormat:@"%d",respRateTemp];
       label.textAlignment = UITextAlignmentRight;
       label.textColor = [UIColor blueColor];
       label.autoresizingMask = UIViewAutoresizingFlexibleRightMargin |
       UIViewAutoresizingFlexibleHeight;
       [cell.contentView addSubview:label];
   }

   return cell;
}

Есть идеи, почему будет убирать последний ряд вместо выбранного?

РЕДАКТИРОВАТЬ: я на самом деле смог исправить это самостоятельно, используя deleteRowsAtIndexPaths: вместо updateData, однако теперь у меня есть другая проблема. Моя программа отлично работает на симуляторе, но часто вылетает на устройстве. Приходит ошибка:

Программа получила сигнал: "EXC_BAD_ACCESS".

Средство форматирования данных временно недоступно, повторная попытка после продолжения. (Не удается найти функцию dlopen, поэтому невозможно загрузить разделяемые библиотеки.)

1 Ответ

0 голосов
/ 30 марта 2012

Проблема с делегатом cellForRowAtIndexPath.В соответствии с вашей логикой табличное представление dequeueReusableCells с индексными номерами, что приводит к удалению последней строки вместо выбранной строки.Может быть, вы можете изменить логику в cellForRowAtIndexPath или использовать правильную структуру данных и алгоритмы для управления представлением таблицы.

...