Объединение статического и прототипного содержимого в табличном представлении - PullRequest
36 голосов
/ 17 февраля 2012

Есть ли способ объединить статические ячейки табличного представления (статическое содержимое) с динамическими ячейками табличного представления (содержимое прототипа) с использованием раскадровки?

Ответы [ 8 ]

55 голосов
/ 20 марта 2012

Я предлагаю вам относиться к вашему столу как к динамическому, но включайте ячейки, которые вы всегда хотите, вверху. В раскадровке поместите UITableViewController и пусть он использует динамическую таблицу. Добавьте столько UITableViewCell прототипов к таблице, сколько вам нужно. Скажем, по одному для ваших статических ячеек и по одному для представления переменных ячеек.

В вашем UITableViewDataSource классе:

#define NUMBER_OF_STATIC_CELLS  3

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.dynamicModel count] + NUMBER_OF_STATIC_CELLS;
}

, а затем

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

    if (indexPath.row < NUMBER_OF_STATIC_CELLS) {
        // dequeue and configure my static cell for indexPath.row
        NSString *cellIdentifier = ... // id for one of my static cells
    } else {
        // normal dynamic logic here
        NSString *cellIdentifier = @"DynamicCellID"
        // dequeue and configure for [self.myDynamicModel objectAtIndex:indexPath.row]
    }
}
12 голосов
/ 01 декабря 2012

У меня была проблема, хотя это был небольшой вариант этого. Я действительно хотел смешать динамические и статические ячейки, но в разных группах. Значение группы 1 будет иметь только статические ячейки, а группа 2 будет иметь динамические ячейки.

Я выполнил это путем жесткого кодирования статических значений ячеек (на основе их идентификаторов ячеек-прототипов). Динамические разделы будут иметь нормальное динамическое наполнение. Вот пример кода на случай, если у кого-то есть такая же проблема:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{    
    if (section == 1){
        return @"Dynamic Cells";
    }
    if (section == 0){
        return @"Static Cells";
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (section == 0) {
        return 1; //However many static cells you want
    } else {
        return [_yourArray count];
    }
}

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    if (indexPath.section == 0) {
        NSString *cellIdentifier = @"staticCellType";   
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }

        cell.textLabel.text = @"some static content";        
        return cell;

    } else if (indexPath.section == 1){

        NSString *cellIdentifier = @"dynamicCellType";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }

        cell.textLabel.text = [_yourArray objectAtIndex:indexPath.row];
        return cell;

    } 
    return nil;

}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 2;
}
5 голосов
/ 18 октября 2015

Поскольку на самом деле никто не дал реального ответа на эту проблему (используя статические и прототипные ячейки в одном и том же табличном представлении), я решил, что я буду вмешиваться. Это можно сделать!

Создайте свои статические ячейки, как считаете нужным. Для разделов, которым нужна динамическая ячейка, если вы НЕ используете стандартный тип UITableViewCell, вам нужно создать свой собственный в отдельном Nib, в противном случае вы можете использовать стандартные. Затем реализуйте следующие делегаты. В основном для каждого из этих делегатов, для статического материала, который мы хотим назвать super, для динамического мы возвращаем наши значения.

Во-первых, если вам нужно выборочно показывать свой динамический раздел, вам нужно реализовать numberOfSectionsInTableView (в противном случае вы можете оставить этот делегат вне):

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    int staticSections = 1;
    int dynamicSections = 1;
    if (SOME_BOOLEAN) {
        return staticSections + dynamicSections;
    } else {
        return staticSections;
    }
}

Затем вам нужно реализовать numberOfRowsInSection:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (section == 1) {
        return A_COUNT;
    } else {
        return [super tableView:tableView numberOfRowsInSection:section];
    }
}

Затем вам нужно реализовать heightForRowAtIndexPath:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 1) {
        return 44.0f;
    } else {
        return [super tableView:tableView heightForRowAtIndexPath:indexPath];
    }
}

Тогда отступ inLevelForRowAtIndexPath:

- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 1) {
        return 1; // or manually set in IB (Storyboard)
    } else {
        return [super tableView:tableView indentationLevelForRowAtIndexPath:indexPath]; // or 0
    }
}

Наконец, cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 1) {
        SomeObject *obj = self.someArray[indexPath.row];
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"DynamicCell" forIndexPath:indexPath];
        cell.textLabel.text = obj.textValue;
        return cell;
    } else {
        return [super tableView:tableView cellForRowAtIndexPath:indexPath];
    }
}
3 голосов
/ 16 марта 2012

Вы всегда можете сделать так, чтобы ваши таблицы выглядели аналогично статической таблице, но определяйте ее в коде.Задайте разделы, количество или строки для каждого раздела, заголовки и т. Д. С помощью методов делегата.

3 голосов
/ 15 марта 2012

К сожалению, это невозможно, поскольку статические представления таблицы должны находиться в UITableViewController, и это допускает только одно представление таблицы.

Что вам нужно сделать, так это создать еще три динамических UITableviewCell и загрузить их по отдельности для первых трех строк, в которых вы хотите статический контент.

Если вы не уверены, как это сделать, дайте мне знать, и я смогу найти код.

2 голосов
/ 17 февраля 2012

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

  1. Добавьте UIViewController в вашу раскадровку.
  2. Добавьте два табличных представления (не TableViewControllers) в контроллер UIView.
  3. Выберите каждое табличное представление и настройте оба для динамических ячеек.
  4. Создайте и прикрепите контроллер вида. 2 табличного представления в одном представлении объясняет этот шаг.

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

0 голосов
/ 04 декабря 2014

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

Для динамического раздела моего табличного представления я размещаю одну или несколько ячеек в Интерфейсном Разработчике.Во время выполнения я могу их клонировать, заархивировав с помощью NSCoder, а затем разархивировав.

Он работает, но не обязательно красивее, чем начинать с динамического представления таблицы прототипов и создавать оттуда статические строки.

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == kContactsSection) {
        NSArray     *contacts   = self.contacts;
        Contact     *contact    = [contacts objectAtIndex:indexPath.row];
        NSString    *name       = contact.name;
        NSString    *role       = contact.role;

        if ([role length] == 0) {
            NNContactDefaultTableViewCell *cell = (id)[tableView dequeueReusableCellWithIdentifier : @"contactDefault"];

            if (cell == nil) {
                NNContactDefaultTableViewCell   *template   = (id)[super tableView : tableView
                                                         cellForRowAtIndexPath :[NSIndexPath indexPathForRow:0 inSection:kContactsSection]];

                NSData                          *data       = [NSKeyedArchiver archivedDataWithRootObject:template];

                cell = [NSKeyedUnarchiver unarchiveObjectWithData:data];
            }

            cell.contactTextLabel.text = name;

            return cell;
        }
        else {
            NNContactDetailTableViewCell *cell = (id)[tableView dequeueReusableCellWithIdentifier : @"contactDetail"];

            if (cell == nil) {
                NNContactDetailTableViewCell    *template   = (id)[super tableView : tableView
                                                        cellForRowAtIndexPath :[NSIndexPath indexPathForRow:1 inSection:kContactsSection]];

                NSData                          *data       = [NSKeyedArchiver archivedDataWithRootObject:template];

                cell = [NSKeyedUnarchiver unarchiveObjectWithData:data];
            }

            cell.contactTextLabel.text          = name;
            cell.contactDetailTextLabel.text    = role;

            return cell;
        }
    }

    return [super tableView:tableView cellForRowAtIndexPath:indexPath];
}

В приведенном выше примере у меня есть два типа ячеек.Оба выложены в Интерфейсном Разработчике как часть статического табличного представления.

Чтобы получить динамическое содержимое в одном разделе, мне также нужно переопределить следующие методы:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (section == kContactsSection) {
        NSArray     *contacts       = self.contacts;
        NSUInteger  contactCount    = [contacts count];

        return contactCount;
    }

    return [super tableView:tableView numberOfRowsInSection:section];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSInteger   section = indexPath.section;
    NSInteger   row     = indexPath.row;

    if (section == kContactsSection) {
        return [super tableView:tableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:kContactsSection]];
    }

    return [super tableView:tableView heightForRowAtIndexPath:indexPath];
}

- (CGFloat)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSInteger   section     = indexPath.section;

    if (section == kContactsSection) {
        CGFloat indentation = [super tableView:tableView indentationLevelForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:kContactsSection]];

        return indentation;
    }

    CGFloat     indentation = [super tableView:tableView indentationLevelForRowAtIndexPath:indexPath];

    return indentation;
}
0 голосов
/ 17 апреля 2013

Вы также можете создать кнопки (по одной для каждой имеющейся у вас статической ячейки), стилизованные под ваши ячейки, и поместить их в tableHeaderView или tableFooterView объекта UITableView;в конце концов, эти кнопки - просто представления.

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

Конечноэто предполагает, что вы хотите вставить статические ячейки в табличное представление вверху или внизу таблицы.

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