У меня есть многосекционный просмотр таблицы.В режиме редактирования я разрешаю перемещение строк из одного раздела в другой.После удаления последней строки из одного раздела я удаляю этот раздел.Поэтому я использую deleteSection внутри moveRowAtIndexPath.
Когда последний элемент перемещается из раздела, заголовок раздела исчезает, как и планировалось.Но есть очень странная ошибка анимации, когда перемещенная строка, кажется, «сливается» со строкой, над которой она была опущена, и пустая строка отображается в нижней части раздела «to» (возможно, потому что numberOfRows для этого разделаправильно, но 2 ряда находятся в одинаковом положении).Еще более странно, что когда я нажимаю на элемент управления переупорядочением для этой строки (не перемещая элемент, просто касаясь и отпуская), два элемента «исчезают».
Я разместил видео , демонстрирующее это.
Я попытался обернуть изменения в своих данных и просмотреть изменения в начале / конце обновлений, но безрезультатно.
Я загрузил тестовый проект здесь , и ятакже разместим код ниже.Пара моментов:
- Я попытался воспроизвести формат моего источника данных в демонстрационном проекте, на тот случай, если именно здесь возникла проблема.Ключевым моментом является то, что мой источник представляет собой составной массив из двух других массивов (хотя я не понимаю, почему это может быть проблемой).
- Чтобы увидеть рассматриваемое поведение, переместите две строки внизураздел, в верхний раздел.Не оставляйте их в последнем ряду в верхнем разделе, хотя, похоже, это работает нормально.
- Перемещение строк в обратном направлении, из верхнего раздела в нижний раздел, содержит ошибки в этом демонстрационном проекте.
Код (все это в демонстрационном проекте):
Я настроил свои массивы в loadView:
- (void)loadView{
array1 = [NSMutableArray array];
[array1 addObject:@"test 0"];
[array1 addObject:@"test 1"];
[array1 addObject:@"test 2"];
array2 = [NSMutableArray array];
[array2 addObject:@"test a"];
[array2 addObject:@"test b"];
[super loadView];
}
У меня также есть метод, который возвращает комбинацию этих массивов - он используется в качестве источника данных:
- (NSMutableArray *)sourceArray{
NSMutableArray *result = [NSMutableArray array];
if (array1.count > 0) {
[result addObject:array1];
}
if (array2.count >0) {
[result addObject:array2];
}
return result;
}
, который учитывает очень простое количество строк / разделов:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return self.sourceArray.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return [[self.sourceArray objectAtIndex:section] count];
}
Стандартное форматирование ячейки / заголовка:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.textLabel.text = [[self.sourceArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
return cell;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return [NSString stringWithFormat:@"Section %i", section];
}
Здесь я делаю магию
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
NSMutableArray *fromArray = [self.sourceArray objectAtIndex:fromIndexPath.section];
NSMutableArray *toArray = [self.sourceArray objectAtIndex:toIndexPath.section];
NSString *movedObject = [[self.sourceArray objectAtIndex:fromIndexPath.section] objectAtIndex:fromIndexPath.row];
[fromArray removeObject:movedObject];
[toArray insertObject:movedObject atIndex:toIndexPath.row];
if ([self.tableView numberOfRowsInSection: fromIndexPath.section] == 0) {
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:fromIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
}
}