2009-10-25 3 views
2

У меня возникла проблема с тем, как iPhone повторно использует ячейки в таблице. Проблема в том, что реализованные методы класса также «повторно используются», а изменения в одной ячейке применяются к другим ячейкам, которые были повторно использованы. У меня есть индикатор прогресса, который должен обновляться только в одной ячейке после взаимодействия с пользователем, но индикатор прогресса обновляется, а метод также запускается внутри 6-й ячейки. Это происходит и во 2-й и 7-й ячейках.Несколько пользовательских UITableViewCells - ReuseIdentifier и НЕ повторно использовать ячейки

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

CustomTableCell *cell = [tableView dequeueReusableCellWithIdentifier:nil]; 

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

Мне нужно знать, есть ли быстрый, безболезненный способ сделать iPhone просто нарисовать каждую отдельную ячейку отдельно, без повторного использования. Есть ли способ использовать быструю итерацию или цикл for для создания отдельной ячейки для каждой строки в источнике данных?

Пожалуйста, позвольте мне повторить, у меня никогда не будет больше 7 или 8 ячеек в одной таблице на данном viewController.

ответ

0

Что, наконец, сработало для меня, было программно делать макет. Использование построителя интерфейса для TableViewCells просто затруднительно. Создание класса TableViewCell и метода layoutSubviews с большим количеством CGRects и свойств кадра - вот что заставило его работать. Несмотря на то, что ячейки повторно используются, фактические данные INSIDE THE CELL не перезаписываются.

2

Если вы действительно хотите это сделать ... настройте массив в viewDidLoad, который длится 7 или 8. Сделайте [[UITableView alloc] initWithStyle:UITabeViewCellStyle… reuseIdentifier:@"whatever"] 7 или 8 раз, затем в cellForRowAtIndexPath, верните ячейку из массива. Вы должны обязательно освободить массив ячеек в методе dealloc.

+0

Наверное, я забыл сказать, что я загружаю эти ячейки из файла nib. Я нашел отличный учебник по этому поводу в iCodeBlog. Ячейки действительно настроены и имеют довольно много информации. Чтобы использовать ваш метод, мне нужно, чтобы layoutSubviews в коде. Я постараюсь завтра, я действительно устал прямо сейчас. – Justin

+0

Вам не придется делать макеты. Единственное различие заключается в том, что вы не создаете их на дебаде, а создаете их раньше времени. cellForRowAtIndexPath просто просит, чтобы вы вернули ячейку, и это то, что вы делаете. – coneybeare

+0

Вы не можете буквально называть initWithStyle: reuseIdentifier: initializer. Вы будете распределять ячейки точно так же, как если бы вы выбрали dequeueReusableCellWithIdentifier: return nil. Но главное, * не * вызывать dequeueReusableCellWithIdentifier :. –

0

Если вы используете только 7 строк - повторное использованиеIdentifyer бесполезно. Как это работает? Представьте, что вы прокручиваете таблицу со множеством строк вниз. Есть момент, когда одна из строк будет скрыта, а другая будет показана. Только тогда таблица получает ячейку reusecellidentifyer. Он не выделяет память для другой ячейки. Он отображает скрытую строку и использует ее для отображения новой строки. Извините за мой английский)

+0

Но если я изменяю reuseIdentifer на nil, таблица рисует ячейку каждый раз, когда таблица прокручивается, поэтому ячейки наверху заменяются, когда я прокручиваю вниз, а затем создаю резервную копию, перезаписывая все обновления ячеек в этом процессе. – Justin

+0

Вы не можете использовать reuseIdentifyer вообще, если у вас всего 7 строк. – Morion

Смежные вопросы