UITableView с пользовательским подпредставлением ячейки - respdsToSelector:]: сообщение отправлено на освобожденный экземпляр - PullRequest
2 голосов
/ 09 февраля 2011

У меня есть ViewController, который содержит UITableView, в котором ячейки создаются с помощью настраиваемого подпредставления (чтобы каждая ячейка имела метку и текстовое поле). Подвид включает методы делегата TextField, которые запускаются для textFieldDidBeginEditing, textFieldDidEndEditing и т. Д. UITableView кэширует видимые ячейки и уничтожает их, когда ячейка больше не видна. У меня возникает проблема, когда пользователь нажимает на TextField в ячейке, а затем прокручивает таблицу, чтобы «редактируемая» ячейка была вне поля зрения, а затем нажимает на новую ячейку, чтобы отредактировать ее, метод делегата textFieldDidEndEditing исходной ячейки имеет вид вызвал ошибку "responsedsToSelector:]: сообщение, отправленное на освобожденный экземпляр", поскольку исходное / первое TextField было уничтожено UITableView при его прокрутке из видимой области.

Кто-нибудь имел дело с этой проблемой раньше и нашел решение, чтобы я мог сохранить свои методы textFieldDidEndEditing для правильной обработки данных, введенных пользователем, без уничтожения теперь невидимых ячеек?

РЕДАКТИРОВАТЬ: я только что нашел это в справочном документе класса UITableView: «Избегайте ретрансляции содержимого. При повторном использовании ячеек с пользовательскими подпредставлениями воздержитесь от размещения этих подпредставлений каждый раз, когда табличное представление запрашивает ячейку. когда ячейка создана. "

Это, я думаю, корень моей проблемы. Но я не уверен, как следовать этому совету. Помощь ...

Ответы [ 3 ]

2 голосов
/ 09 февраля 2011

«UITableView кэширует видимые ячейки и уничтожает их, когда ячейка больше не видна».Это верно только в том случае, если вы не предоставите идентификатор повторного использования.

Предполагая, что вы работаете в подробном представлении, где каждая ячейка представляет (по крайней мере, концептуально) свойство некоторого объекта модели, вы можете назначить каждомуячейка уникальный идентификатор повторного использования.Вы можете установить это непосредственно в Интерфейсном Разработчике, или, если вы создаете ячейки программно, передавая его в качестве аргумента initWithStyle:reuseIdentifier: или initWithFrame:reuseIdentifier.

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

cell = [tableView dequeueReusableCellWithIdentifier:@"Some Identifier You Made Up"];

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

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

0 голосов
/ 10 января 2013

Я не знаю, нашли ли вы решение еще. Но я столкнулся с той же проблемой, и я исправил ее, установив делегат текстового поля равным nil в dealloc моего настраиваемого поля, прежде чем освобождать его. Таким образом, делегат textFieldDidEndEditing не вызывается в освобожденной ячейке. Я также не использовал идентификатор повторного использования.

- (void)dealloc {
  [textField_ setDelegate:nil];
  [textField_ release];
  [super dealloc];
}
0 голосов
/ 28 ноября 2012

Мне интересно, может ли это быть вашей проблемой:

if (cell == nil) {
    // dont do this -->cell = [[[customCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];


    NSArray *topLevelsObjects = [[NSBundle mainBundle] loadNibNamed:@"NewUserCustomCell" owner:nil options:nil];
    for (id currentObject in topLevelsObjects){
        if ([currentObject  isKindOfClass:[UITableViewCell class]]){
            cell = (customCell *) currentObject;
            break;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...