EXC_BAD_ACCESS при прокрутке TableView - PullRequest
0 голосов
/ 08 сентября 2010

В моей программе я создаю несколько пользовательских UIViewCells, загруженных из nib-файла:

[[NSBundle mainBundle] loadNibNamed:@"CustomCells" owner:self options:nil];

Как только они загружены, я устанавливаю их и возвращаюсь из функции:

if (indexpath.row == 1) {
    [nibTextInputer setupWithName:@"notes" ...];
    return nibTextInputer;
} else {
    [nibSelectInputer setupWithName:@"your_choice" ...];
    return nibSelectInputer;
};

Где nibTextInputer моего класса (AFTextInputer), а nibSelectInputer моего другого класса (AFTextInputer).Оба класса являются подклассами из UITableViewCell.

Все работает нормально, НО ломается, когда я добавляю к этому кеширование:

Boolean inCache = false;
if (indexPath.row == 1) {
   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"nibTextInputer"];
   if (cell != nil) {
      NSLog(@"%@", [cell description]); // prints out ok, correct type.
      nibTextInputer = (AFTextInputer*) cell;
      inCache = true;
   };
};

if (!inCache) {
    [[NSBundle mainBundle] loadNibNamed:@"CustomCells" owner:self options:nil];
}

Как только я добавляю вышеописанное, EXC_BAD_ACCESS начинает появляться в случайных местах, обычно бездополнительная информация, а иногда и с этой ошибкой:

-[CALayer prepareForReuse]: unrecognized selector sent to instance

или даже

-[UIImage prepareForReuse]: unrecognized selector sent to instance

Расположение EXC_BAD_ACCESS, по-видимому, случайное.Иногда это сразу после «dequeue», иногда за пределами функции ..

Я думаю, проблема заключается в моей реализации пользовательских UIViewCells, но я не знаю, с чего начать искать ..

Идеи?

Ответы [ 2 ]

2 голосов
/ 08 сентября 2010

В вашем UITableViewCell произошел перепроизводитель. -[UITableViewCell prepareForReuse] вызывается непосредственно перед возвратом из -[UITableView dequeueReusableCellWithIdentifier:], но когда она вызывается, ячейки больше нет, вместо этого есть CALayer, UIImage или что-то, к чему у вас нет доступа.

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

static NSString *CellIdentifier = @"CustomCell"; // This string should also be set in IB

CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
    cell = nibCell; // nibCell is a retained IBOutlet which is wired to the cell in IB
}

// Set up the cell...
0 голосов
/ 08 сентября 2010

Вероятно, именно здесь вы столкнетесь с проблемами:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"nibTextInputer"];

Класс UITableView объединяет все ваши ячейки в один и тот же пул для повторного использования;он не знает, что некоторые ячейки являются одним видом подкласса (например, AFTextInputer), а некоторые ячейки являются другим видом подкласса (например, AFTextInputer).Поэтому, когда вы удаляете из очереди ячейку в блоке if (indexPath.row == 1), вы можете получить неправильный вид подклассовой ячейки обратно.«Идентификатор» - это просто строка, которая указывает встроенному кешу, на какие ячейки таблицы вы ссылаетесь;фактически она не использует эту строку для поиска в кэше, чтобы найти объект с соответствующим именем подкласса.

PS Почему вы используете тип с именем Boolean вместо «встроенного» * ​​1008*

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