it-swarm.com.ru

Объединение статического и прототипного содержимого в табличном представлении

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

36
tazboy

Я предлагаю вам относиться к вашему столу как к динамическому, но включайте ячейки, которые вы всегда хотите, вверху. В раскадровке поместите переменную 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]
    }
}
55
danh

У меня была проблема, хотя это был небольшой вариант этого. Я действительно хотел смешивать динамические и статические ячейки, но в разных группах. Значение группы 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;
}
12
AbuZubair

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

Создайте свои статические ячейки так, как считаете нужным. Для разделов, которым требуется динамическая ячейка, если вы НЕ используете стандартный тип 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];
    }
}

Тогда indentationLevelForRowAtIndexPath:

- (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];
    }
}
5
Sean

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

3
Michael

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

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

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

3
lnafziger

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

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

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

2
T.J.

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

Для динамического раздела моего табличного представления я размещаю одну или несколько ячеек в Интерфейсном Разработчике. Во время выполнения я могу их клонировать, заархивировав с помощью 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
Pierre Bernard

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

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

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

0
BeckProduct