Я предполагаю, что вы получаете устаревший UITableViewCell, который уже содержит UIScrollView. Если вы действительно заботитесь о разделении типов ячеек, я бы порекомендовал настроить его так, чтобы у вас было как минимум две строки CellIdentifier. (Бывают случаи, когда я настраиваю UITableView для обработки 4+ различных типов ячеек; если вы выходите за рамки одного типа ячеек, это в значительной степени просто больше того же.)
Мое предлагаемое решение: (см. Пояснение под кодом)
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"bodyCell";
static NSString *HeaderIdentifier = @"headerCell";
UITableViewCell *cell;
// I break this up into 3 sections
// #1. Try to dequeue a cell
// #2. Create a new cell (if needed)
// #3. Set up the cell I've created
// Step 1: Try to dequeue a cell
if ([indexPath section] == 0) {
cell = [tableView dequeueReusableCellWithIdentifier:HeaderIdentifier];
} else {
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
}
// At this point, we may or may not have a cell to use,
// so we check for the cell's value being equal to 'nil'
// and create a new cell if it is
// Step 2: Create a new cell (if needed)
if (cell == nil) {
// Again, here we check for section to determine
// what kind of cell we want
if ([indexPath section] == 0) {
// We have the "header"/first cell
// Option 1
cell = [[ScrollViewTableViewCell alloc] init];
// Option 2 (this assumes you've got a xib named
// ScrollingTableViewCell along with a class property
// named headerCell and have properly wired it up in
// Interface Builder)
[[NSBundle mainBundle] loadNibNamed:@"ScrollingTableViewCell"
owner:self
options:nil];
cell = [self headerCell];
[self setHeaderCell:nil];
} else {
// We have a "body" cell (anything other than the first cell)
// Option 1
cell = [[BodyTableViewCell alloc] init];
// Option 2 (again, assuming you've set things up properly)
[[NSBundle mainBundle] loadNibNamed:@"BodyTableViewCell"
owner:self
options:nil];
cell = [self bodyCell];
[self setBodyCell:nil];
}
}
// At this point, whether dequeued or created
// new, 'cell' should be populated
// Again, we check for section and set up the cell as appropriate
if ([indexPath section] == 0) {
// Set up the header (UIScrollView) cell as appropriate
// This is where you would add the UISCrollView to your cell
// (if you haven't set up the UIScrollView through Interface Builder)
} else {
// Set up the "body" cell as appropriate
}
return cell;
}
ПРИМЕЧАНИЕ: I ВЫСОКИЙ рекомендую использовать вариант 2 выше. Безусловно, наилучшие результаты, которые я нашел при использовании пользовательских / нестандартных UITableViewCells, - это создание собственного подкласса UITableViewCell и xib для его реализации. Вот шаги для этого:
- Создайте подкласс UITableViewCell (мы назовем ваш ScrollingTableViewCell.h / .m)
- Класс forward / import ScrollingTableViewCell в ваш UITableViewController (или UIViewController, в котором размещен UITableView).
- Создайте свойство класса типа ScrollingTableViewCell (мы назовем ваш ScrollingCell).
- Создайте представление (Новый файл> Пользовательский интерфейс> Представление) (мы назовем ваш ScrollingTableViewCell.xib).
- Удалите элемент представления товара в xib и замените его элементом UITableViewCell.
Альтернатива № 4/5
- Создать пустой Xib.
- Добавить элемент UITableViewCell.
ОЧЕНЬ ВАЖНО
- В xib владельцем файла является ViewController, NOT UITableViewCell. В ячейке класс является ScrollingTableViewCell.
- В IB подключите свойство ViewController ScrollingCell к элементу UITableViewCell.
Если вы будете следовать вышеприведенным инструкциям, вы сможете выделить свою ячейку, используя описанный выше вариант 2, а затем вы можете настроить ее в ScrollingTableViewCell.h / .m.