У меня есть UITableView
с одним разделом и 'n' строками (заполняется из NSMutableArray
, myTableArray
). При входе в режим редактирования мне хотелось бы добиться следующего:
- установить для строк "n" стиль редактирования
UITableViewCellEditingStyleDelete
- вставьте новую строку выше исходного 'n' и установите для нее стиль редактирования
UITableViewCellEditingStyleInsert
Мой UITableViewController
подкласс реализован следующим образом:
- (void)setEditing:(BOOL)flag animated:(BOOL)animated
{
[super setEditing:flag animated:animated];
UITableView *tableView = (UITableView *)self.view;
NSArray *topIndexPath = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]];
if (self.editing == YES)
[tableView insertRowsAtIndexPaths:topIndexPath withRowAnimation:UITableViewRowAnimationBottom];
else
[tableView deleteRowsAtIndexPaths:topIndexPath withRowAnimation:UITableViewRowAnimationBottom];
}
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 0)
return UITableViewCellEditingStyleInsert;
else
return UITableViewCellEditingStyleDelete;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (self.editing == YES)
return [myTableArray count] + 1;
else
return [myTableArray count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// ... boiler-plate dequeueReusableCellWithIdentifier code, etc ...
if (self.editing == YES)
{
if (indexPath.row == 0)
cell.textLabel.text = @"My new row";
else
cell.textLabel.text = [myTableArray objectAtIndex:(indexPath.row - 1)];
}
else
{
cell.textLabel.text = [myTableArray objectAtIndex:indexPath.row];
}
return cell;
}
Когда этот код выполняется и нажата кнопка «Редактировать», новая строка вставляется над исходными «n» строками, однако вторая строка, помимо первой, имеет стиль редактирования UITableViewCellEditingStyleInsert
. Например, если n равно 3, после нажатия кнопки «Редактировать» в таблице отображается:
- строка 0: вставить стиль редактирования
- строка 1: вставить стиль редактирования (следует удалить)
- строка 2: удалить стиль редактирования
- строка 3: удалить стиль редактирования
После дальнейшего изучения я заметил, что если n равно 3 и нажата кнопка «Изменить», метод tableView:editingStyleForRowAtIndexPath:
вызывается всего 8 раз:
[super setEditing:flag animated:animated]
приводит к 3 вызовам для каждой из исходных строк 0, 1 и 2
- последующее
[tableView insertRowsAtIndexPaths:topIndexPath withRowAnimation:UITableViewRowAnimationBottom]
приводит к 5 вызовам для строк 0, 1, 2, 3, а затем снова к 0
Я могу понять, что стиль редактирования должен быть повторно исправлен в результате вставки новой строки, однако я не понимаю, почему в последних 5 вызовах строка 0 устанавливается дважды и почему строке 1 все еще удается иметь неправильный стиль.
У кого-нибудь есть понимание?