временно запретить утилизацию UITableViewCell - PullRequest
3 голосов
/ 21 марта 2011

Мои UITableViewCells могут принимать ввод данных. Работая в одной ячейке, было бы вполне естественно, что пользователь хочет прокрутить вверх, проверить что-то в другой ячейке, затем вернуться в первую ячейку и продолжить ввод данных.

Проблема в том, что это часто приводит к тому, что UITableView перезапускает ячейку, что приводит к хаосу в моей программе.

Есть ли способ временно сказать iOS не перерабатывать ячейку?

Как только ввод данных сделан, я в порядке, если они будут переработаны.

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

Ответы [ 4 ]

4 голосов
/ 21 марта 2011

Дайте другой cellIdentifier для ячеек, которые значительно отличаются. Если ячейка внизу имеет свой собственный идентификатор, то когда пользователь прокручивает страницу вниз, она не будет перерабатывать вашу ячейку сверху. Однако это по-прежнему сохранит вашу ячейку вверху в очереди повторного использования, поэтому при прокрутке назад к вершине вам не нужно будет ее воссоздавать.

3 голосов
/ 21 марта 2011

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

Если вы хотите это сделать, вы должны реализовать его самостоятельно вМетод протокола источника данных UITableView - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath.

2 голосов
/ 21 марта 2011

Как сказал главным образом Иззи, это не обычный способ работы. И если идти против того, как работают списки, это может вызвать проблемы. Если вы хотите уменьшить свою проблему, сохраняйте содержимое вашей ячейки в памяти и используйте этот сохраненный контент для пополнения ячейки при вызове willDisplayCell вместо того, чтобы каждый раз перестраивать весь процесс с самого начала.

0 голосов
/ 14 января 2015

Решение Гендолкари дало мне идею временно удалить ячейку из цикла удаления.Он включает в себя установку значения только для чтения с помощью KVC, поэтому он не предназначен для действительно хакерских помех.

Если вы сначала хотите удалить ячейку из цикла, измените reuseIdentifier для этой конкретной ячейки.Мы хотим найти ячейку позже, поэтому переименуйте ее в то, что мы можем индексировать.Я нашел [NSIndexPath description], чтобы быть полезным здесь.ReuseIdentifier является свойством только для чтения, но это Objective-C, и у нас есть KVC:

[cell setValue:[[self.tableView indexPathForCell:cell] description] forKey:@"reuseIdentifier"];

Теперь, когда мы повторно используем ячейку в cellForRowAtIndexPath:

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];

, мыЯ не вернусь к этой конкретной ячейке, потому что мы изменили reuseIdentifier.

Однако, если мы прокручиваем вниз, затем прокручиваем назад вверх, мы, вероятно, хотим отобразить исходную ячейку, которую мы удалили из цикла удаления.Чтобы сделать это, когда мы повторно используем ячейку, сначала попытайтесь удалить из нее ячейку на основе indexPath, и если мы не сможем обнаружить эту попытку, просто на основе базовой строки идентификатора ячейки:

UITableViewCell *cell;
cell = [self.tableView dequeueReusableCellWithIdentifier:[indexPath description]];
if (!cell) cell = [self.tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];

Если вы хотите вернуть эту ячейку обратно в цикл удаления, просто измените reuseIdentifier обратно на исходное значение:

[cell setValue:@"cellIdentifier" forKey:@"reuseIdentifier"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...