Странное поведение UITableView после прокрутки и вставки новой строки - PullRequest
3 голосов
/ 12 июля 2009

Это действительно сводит меня с ума.

У меня есть табличное представление, которое отображает отсортированный список клиентов. Пользователи могут добавить нового клиента, поэтому мне нужно добавить новую строку в табличное представление (путем обновления модели данных и вызова insertRowsAtIndexPaths:withRowAnimation:). Однако, так как табличное представление отсортировано, эта вставка может происходить вне экрана, что не очень приятно. Пользовательский опыт. Поэтому моя идея состояла в том, чтобы прокрутить табличное представление до пути индекса, где будет происходить вставка, прежде чем вставлять строку:

- (void)finishedSavingNewCustomer:(Customer*)customer atIndex:(NSInteger)index {
    // NOTE: self.customers (which is the model for the table view used in all datasource
    // methods) has already been updated at this point, ie. it already contains the new customer

    // scroll the table view so that the insert position is on-screen
    NSInteger scrollRow = (index < ([self.customers count] - 1) ? index : [self.customers count] - 2);
    NSIndexPath* scrollIndexPath = [NSIndexPath indexPathForRow:scrollRow inSection:0];
    [self.tableView scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionNone animated:NO];

    // insert the new row
    NSArray* indexPaths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:index inSection:0]];
    [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];
}

Этот код на самом деле работает должным образом: табличное представление прокручивается, и новая строка вставляется правильно.

Однако после вставки некоторые ячейки табличного представления становятся «не отвечающими» , т.е. они не будут отображать кнопку удаления при пролистывании и даже не будут выделены при выборе. Поскольку это действительно странно и довольно сложно объяснить, позвольте мне попытаться проиллюстрировать это.

Исходная ситуация: отображаются строки 1 - 5:

--------- screen top --------
Row 1
Row 2
Row 3
Row 4
Row 5
------- screen bottom -------
Row 6
Row 7
Row 8 
Row 9

Ситуация после прокрутки и вставки:

Row 1
Row 2
Row 3
Row 4
Row 5
--------- screen top --------
Row 6
Row 7
Row 7a  << newly inserted
Row 8 
Row 9
------- screen bottom -------

Теперь после вставки строки 1 - 5 не будут реагировать на взаимодействие с пользователем, как описано выше.

Кто-нибудь когда-нибудь сталкивался с такой проблемой? Идеи? Существуют ли другие способы убедиться, что вставка новых строк видима для пользователя?


Обновление: Только что протестировано на устройстве, и получается, что эта проблема возникает только на симуляторе! Это делает проблему менее неприятной, но мне все равно было бы интересно, если бы кто-то еще испытывал такое поведение.

1 Ответ

1 голос
/ 12 июля 2009

Недавно у меня был похожий опыт работы с симулятором - я имею дело с приложением, использующим несколько табличных представлений из Core Data, и оно также представляет набор UIAlertViews и UIActionSheets в различных точках приложения.

Я заметил, что симулятор плохо реагирует на события касания сразу после действия пользовательского интерфейса (вставка ячейки таблицы, отображение листа действий и т. Д.). Обычно мне помогает либо

  • переключиться в другое окно, затем вернуться в симулятор или
  • щелкните и перетащите мышь через какую-нибудь неактивную область симулятора, затем попробуйте нужное мне действие снова

Ваш пробег может отличаться. Во время тестирования это может быть проблемой, но если на устройстве все работает правильно, все будет в порядке.

...