Проблема со стилем редактирования при вставке новой строки в верхней части UITableView как часть входа в режим редактирования - PullRequest
4 голосов
/ 02 октября 2009

У меня есть 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 все еще удается иметь неправильный стиль.

У кого-нибудь есть понимание?

Ответы [ 2 ]

6 голосов
/ 04 февраля 2011

Я знаю, что это был год, но я погуглил и наткнулся на это, поэтому давайте ответим на это для потомков.

Кажется, работает следующее. TableViewController запрашивает стиль редактирования, прежде чем он сможет узнать, что строки вставляются вверху. Поэтому мы должны следить за тем, находимся ли мы между изменением режима редактирования и вставками.

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    automaticEditControlsDidShow = NO;
    [super setEditing:editing animated:animated];
    NSArray *addRow = [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:0 inSection:0],nil];
    if (editing) {
        automaticEditControlsDidShow = YES;
        [self.tableView insertRowsAtIndexPaths:addRow withRowAnimation:UITableViewRowAnimationLeft];
    } else {
        [self.tableView deleteRowsAtIndexPaths:addRow withRowAnimation:UITableViewRowAnimationLeft];
    }
}

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    int row = indexPath.row;

    if (self.editing && row == 0) {
        if (automaticEditControlsDidShow)
            return UITableViewCellEditingStyleInsert;
        return UITableViewCellEditingStyleDelete;
    }
    return UITableViewCellEditingStyleDelete;
}
0 голосов
/ 03 октября 2009

Попробуйте отключить анимацию для вставки и посмотрите, сколько раз вызывали вещи.

Проблема, с которой вы столкнулись, заключается в том, что super вызывается, когда нулевая строка является существующей предварительно вставленной строкой, а затем вы выполняете вставку с анимацией, которая вызывает метод editStyle ... 1003 *

Следующее предложение является пугающим, но вы также можете попробовать выполнить тест для редактирования до того, как вызовет super, и выполните вставку / удаление строки, а затем вызов super. таким образом, правильное количество строк на месте.

Большой вопрос ... вы уверены хотите, чтобы строка вставки была верхней? Это нестандартное место для его размещения, и если у вас нет чертовски веских причин идти против принципов пользовательского интерфейса, вы можете подумать о переработке пользовательского интерфейса, чтобы поместить строку со вставкой в ​​нижней части ....

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