Как добавить UIScrollView только в первом UITableCellView? - PullRequest
1 голос
/ 09 октября 2010

У меня есть uitableview в контроллере uiview, я сделал scrollview в событии viewload. Я добавляю его в первую ячейку таблицы. но я прокручиваю табличное представление, оно отображает более одного прокручиваемого просмотра после прохождения 5 ячеек.

вот код.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"customCell";

    DetailCellViewController *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *nibObjects =[[NSBundle mainBundle] loadNibNamed:@"DetailCellView" owner:nil options:nil];
        for (id currentObject in nibObjects)
        {
            if ([currentObject isKindOfClass:[DetailCellViewController class]])
            {
                cell = (DetailCellViewController *) currentObject;
            }
        }
    }

    if (indexPath.row==0) {
        [cell.contentView addSubview:scrollView];
    }
    else {
        NSMutableDictionary *dictionary=[catData objectAtIndex:indexPath.row-1];
        NSString *title =[dictionary objectForKey:@"title"]];
    [cell.catTitle setText:title];
    }
    return cell;
}

в каком случае мне добавлять и удалять скроллвью?

1 Ответ

2 голосов
/ 11 июня 2011

Я предполагаю, что вы получаете устаревший 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 для его реализации. Вот шаги для этого:

  1. Создайте подкласс UITableViewCell (мы назовем ваш ScrollingTableViewCell.h / .m)
  2. Класс forward / import ScrollingTableViewCell в ваш UITableViewController (или UIViewController, в котором размещен UITableView).
  3. Создайте свойство класса типа ScrollingTableViewCell (мы назовем ваш ScrollingCell).
  4. Создайте представление (Новый файл> Пользовательский интерфейс> Представление) (мы назовем ваш ScrollingTableViewCell.xib).
  5. Удалите элемент представления товара в xib и замените его элементом UITableViewCell.

    Альтернатива № 4/5
  6. Создать пустой Xib.
  7. Добавить элемент UITableViewCell.

    ОЧЕНЬ ВАЖНО
  8. В xib владельцем файла является ViewController, NOT UITableViewCell. В ячейке класс является ScrollingTableViewCell.
  9. В IB подключите свойство ViewController ScrollingCell к элементу UITableViewCell.

Если вы будете следовать вышеприведенным инструкциям, вы сможете выделить свою ячейку, используя описанный выше вариант 2, а затем вы можете настроить ее в ScrollingTableViewCell.h / .m.

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