проблемы с удалением ячейки таблицы - PullRequest
0 голосов
/ 06 декабря 2011

в моей таблице (UITableView) Я использую ячейки с UITextField istead, равным UILabel, добавленным в ячейку с помощью "addSubview". Мне это нужно, потому что я хочу, чтобы мои ячейки стали непосредственно редактируемыми. В качестве ячейки я использую UITableViewCellStyleDefault. - Все работает отлично: я могу добавлять и редактировать ячейки в любое время.

Однако удаление создает проблему: когда я «удаляю» ячейку и создаю reloadData таблицу, ячейка по-прежнему отображает свое старое содержимое вместе с новым. Также то же самое для всех клеток ниже. Когда я закрываю свое приложение и запускаю его снова, таблица отображается правильно.

Здесь код, который я использую для удаления ячейки

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
                                            forRowAtIndexPath:(NSIndexPath *)indexPath {

NSUInteger row = [indexPath row];
NSUInteger count = [datas count];

if (row <= count) {

    NSString* data = [datas objectAtIndex: [indexPath row]];
    [self deleteDatas:data];
}

[self.locationTable reloadData];

}

Где в deleteDatas Я просто удаляю соответствующие данные из файла, который работает правильно, как "доказано" новой загрузкой приложения.

Здесь

 -(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];
    UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
    longPressGesture.minimumPressDuration = 2.0;
    [cell addGestureRecognizer:longPressGesture];
}

// Configure the cell.

// table cell with uitextfield instead of lable.
UITextField* textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 185, 30)];
textField.enabled = NO;
[cell.contentView addSubview:textField];

NSUInteger count = [datas count];
NSUInteger row = [indexPath row];

// last cell is empty to edit it
if (row+1 < count) {

    textField.text = [datas objectAtIndex:[indexPath row]];
    [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
}

return cell;

} * * тысяча двадцать-один

Есть идеи? - Спасибо

Любая идея, почему моя ячейка показывает в два раза больше содержимого (один раз из исходной ячейки и один раз из содержимого ячейки ниже?) - я думаю, что s.th. неправильно с перезагрузкой клетки. - Возможно ли, что текстовое поле создает проблемы? - Как я могу это выяснить?

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

Вы, вероятно, должны написать свой commitEditingStyle: метод, похожий на этот:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
  if (editingStyle == UITableViewCellEditingStyleDelete) {
    if (indexPath.row <= [data count]) {
      // Update the model by deleting the actual data
      NSString* data = [datas objectAtIndex:indexPath.row];
      [self deleteDatas:data];
      // Delete the row from the table
      [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationBottom];
    }
  }
}

Другие вещи, которые нужно проверить, это то, что ваш метод для tableView: numberOfRowsInSection: возвращает правильные данные, если это не так, товы получите ошибки утверждения, когда таблица попытается удалить строки, а логика не сложится.

0 голосов
/ 06 декабря 2011

Я думаю, что вы также должны удалить элемент из вашего mutablearray, в commitEditingStyle ...

NSString* data = [datas objectAtIndex: [indexPath row]];
[self deleteDatas:data];
[datas removeObjetAtIndex: [indexPath row]];

В противном случае при ваших следующих reloadData строка все еще находится в памяти и отображается в cellForRow ...

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