«Перестановка контента», которую вы видите, наиболее вероятна из-за неправильной обработки повторного использования ячейки.
Нет особых проблем с групповым стилем. Проблема, скорее всего, проявится в этом стиле, потому что на экране помещается меньше ячеек, что требует большей прокрутки и повторного использования ячеек.
Вы настраиваете содержимое ячейки только при создании ячеек (когда ячейка == ноль). Когда ячейка прокручивается за пределы экрана, она попадает в очередь на повторное использование. Строка на другом конце, которая теперь видна, повторно использует представление ячейки, находящееся в очереди на повторное использование. Повторно используемая ячейка содержит содержимое некоторой другой строки.
Когда все ячейки одинаковы (по крайней мере, в отношении элементов управления пользовательского интерфейса, а не данных), это не проблема. Когда все или некоторые ячейки отличаются, вы получаете элементы управления там, где вы их не ожидаете.
Поскольку у вас есть только небольшое количество строк, и каждая из них размещена по-разному, быстрое (и, возможно, грязное) решение состоит в том, чтобы использовать разные идентификаторы повторного использования для каждой ячейки, например:
NSString *CellIdentifier =
[NSString stringWithFormat:@"RecipientEntryCell-%d-%d",
indexPath.section, indexPath.row];
Это вообще не рекомендуется, если в табличном представлении будет много разных ячеек, поскольку каждая ячейка для каждой строки в таблице будет находиться в памяти одновременно (а не только на нескольких экранах). Не используйте уникальный идентификатор для решения любых проблем повторного использования ячейки.
Руководство по программированию табличного представления показывает альтернативный способ создания табличных представлений, подобных этому, где у вас есть несколько ячеек с различными макетами. См. «Техника для статического содержимого строки» на этой странице .
В конечном счете, лучше понять, что табличное представление повторно использует ячейки по уважительным причинам, а не пытаться все время обходить их. Как правило, cellForRowAtIndexPath должен выглядеть следующим образом:
static NSString *CellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCell...
if (cell == nil) {
//Create cell...
//Set UI content that applies to all rows (if any)...
}
else {
//Cell is being re-used.
//Remove UI content that doesn't apply to this row...
}
//Add UI content that applies only to this row...
//Copy values from data source to cell UI controls...
return cell;
Если вы создаете ячейки, как показано выше, не поддерживайте ссылки на уровне класса на элементы управления пользовательского интерфейса внутри ячеек (например, nameLabel, imageButton и т. Д.). Вместо этого значения элемента управления должны быть установлены в cellForRowAtIndexPath из резервной переменной данных (модель), а значение должно быть прочитано или сохранено обратно в резервную переменную данных, как только элемент управления UI изменится.
Например, вместо сохранения ссылки на UISlider в ячейке, сохраните текущее значение ползунка в виде плавающего ивара. При необходимости инициализируйте объект с плавающей точкой (например, viewDidLoad). В cellForRowAtIndexPath создайте UISlider, задайте его значение с помощью плавающего ivar, а ползунок вызывает метод при изменении его значения. В этом методе скопируйте значение ползунка в плавающий ivar.
Надеюсь, это поможет.