У меня есть UItableview с ячейками. Некоторые ячейки имеют uilabels, а некоторые имеют uibuttons. UI-кнопки создаются всякий раз, когда первый символ в массиве «^». Тем не менее, uibuttons повторяются, когда я прокручиваю вниз (появляется над uilabel) .. и затем размножаюсь по uilabels при прокрутке вверх. Какие-нибудь подсказки почему?UITableViewCell повторяющаяся проблема
ответ
Actaully каждый раз, когда раздел прокручивается и строки загружаются, все ярлыки и компоненты ui добавляются в ячейку во время выполнения, вам нужно очистить все виды, которые добавлены в ячейку, каждый раз, когда ваша ячейка и из очереди не ноль, смотрите следующий пример:
static NSString *CellIdentifier;
CellIdentifier = [NSString stringWithFormat:@"Cell%d%d",indexPath.section,indexPath.row];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
/*
* THIS IS FOR OS VERSION 2.2 THE OLDER VERSION
* cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
*/
} else {
for (UIView* tempView in cell.contentView.subviews) {
[tempView removeFromSuperview];
}
}
Содержимое ячейки не должно быть установлено внутри if (cell == nil)
. Должна быть определена только структура (макет). Содержание должно быть установлено после проверки:
CellIdentifier = @"TableCell";
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
// setup everything that's the same for every cell
// (e.g. add controls to the cell)
}
// setup everything that's different in each cell (set text, images, ...)
То, что здесь происходит, что клетка быть «подготовлен» и кэшируются, так что не нужно будет заново для каждой ячейки. Если вы установите содержимое ячейки внутри if (cell == nil)
, вы храните содержимое ячейки в кеше.
UITableView не сохраняет одну UITableViewCell для каждой логической строки. Он сохраняет только количество ячеек, необходимых для отображения строк, находящихся на экране. На практике это означает, что в каждый момент времени существуют только ячейки высоты по умолчанию 9-11.
Вид таблицы создает иллюзию произвольно длинной таблицы, вызывая источник данных табличного представления и запрашивая новую ячейку для строки или повторно использовать существующую ячейку. Это повторное использование называется «dequeueing» cell. После того, как вы прокручиваете пронумерованные строки, вы больше не создаете новые экземпляры ячеек, а вместо этого используете одни и те же элементы снова и снова.
Ваша проблема возникает из-за того, что, как только вы установили ячейку в UIButton, вы никогда не удаляете ее. Когда ячейка имеет в ней кнопку, она будет отображать эту кнопку навсегда, даже если она используется для отображения логической строки, в которой не должно быть кнопки. Поскольку одни и те же ячейки используются снова и снова, чтобы отображать разные строки, прокрутка быстро заставляет все ячейки отображать кнопки.
Для устранения неполадок необходимо удалить кнопку, если вы хотите отобразить метку, и удалить ярлык, если хотите отобразить кнопку.
Еще лучше, вы должны определить два подкласса UITableViewCell, по одному для каждого дисплея. Когда у вас есть строка с кнопкой, возвращайте ячейку подкласса кнопки, а когда она есть с меткой, верните подкласс метки. Таким образом, вы можете переместить всю логику конфигурации ячейки в класс ячеек и только установить данные в методах данных. Использование подклассов для инкапсуляции пользовательских логических результатов в гораздо более чистый и чистый код, который легче отлаживать и поддерживать.
Я выполнил метод iAnsari и создал элементы ячейки (кнопку или метку) после удаления из супервизора.Я думаю, что ваше решение было бы намного опрятным, но мне было трудно обойти его. Я вернусь к проблеме, когда у меня будет больше времени. – cannyboy
Затем вы должны нажать галочку рядом с ответом iAnsari. – TechZen
Вы используете многоразовые ячейки, поэтому в cellForRowAtIndexPath: вам нужно проверить - есть ли в ячейке кнопка или ярлык? Если это так, удалите их, добавьте-init новый и добавьте его как subview. Для этого используйте теги, это очень удобно.
- 1. CocoaPods Повторяющаяся проблема
- 2. Основная повторяющаяся эхо-проблема
- 3. Проблема, повторяющаяся через двух архаистов
- 4. Повторяющаяся проблема UIAnimation в Swift
- 5. Raspbian gMail Повторяющаяся аутентификация Проблема
- 6. проблема uitableviewcell
- 7. UITableViewCell проблема
- 8. Повторяющаяся проблема с ключом в web api
- 9. Долгосрочная повторяющаяся проблема с копированием в LSTM?
- 10. CRM down: повторяющаяся проблема в MSCRM 2011
- 11. Повторяющаяся проблема с данными android sqlite
- 12. Повторяющаяся проблема Onclick при получении от JSON
- 13. UITableViewCell проблема при прокрутке
- 14. Проблема инициализации UITableViewCell initwithStyle
- 15. Проблема ограничения с UITableViewCell
- 16. UITableViewCell проблема динамической высоты
- 17. Проблема подкласса UITableViewCell
- 18. проблема с subviews uitableviewcell
- 19. Повторяющаяся запись
- 20. UITableViewCell indexPath.section проблема на iPad
- 21. Проблема с повторным использованием UITableViewCell
- 22. Пользовательская проблема UITableViewCell в UITableView
- 23. Проблема с AutoLayout на UITableViewCell
- 24. Проблема при отображении пользовательского UITableViewCell
- 25. Проблема с добавлением UITableViewCell вручную
- 26. Проблема с подсветкой UITableViewCell - iPhone
- 27. Проблема с dequeueReusableCellWithIdentifier, пользовательский UITableViewCell
- 28. Проблема с uibutton в UItableViewCell
- 29. Проблема с загрузкой данных UITableviewcell
- 30. Проблема с UITableViewCell и Autolayout
Я использовал метод iAnsari и поместил код создания метки и кнопки после цикла tempView removeFromSuperview и, похоже, работает. Возможно, это не лучший способ. – cannyboy