Развернуть/свернуть UITableViewCell с другой ячейкой и источником данных

Я сделал UITableView, заполненный источником данных plist, и я сделал пользовательские ячейки с помощью Interface Builder (поэтому я использую файлы xib)

вот часть кода, где я создаю ячейки:

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

    static NSString *CellIdentifier = @"Cell";

    DataTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {

        NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"DataTableViewCell" owner:nil options:nil];

        for (UIView *view in views) {
            if ([view isKindOfClass:[UITableViewCell class]]) {

                cell = (DataTableViewCell*)view;

            }
        }
    }

    return cell;
}

затем, когда я использую:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

чтобы получить выбранную ячейку, я вызываю этот метод, чтобы расширить ячейку:

- (void)expandCellAtIndex:(int)index {

    NSMutableArray *path = [NSMutableArray new];
    NSArray *currentCells = [subCellItems objectAtIndex:index];
    int insertPos = index + 1;
    for (int i = 0; i < [currentCells count]; i++) {
        [path addObject:[NSIndexPath indexPathForRow:insertPos++ inSection:0]];
    }

    [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];
    [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:index inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];

}

Теперь проблема в том, что, поскольку я не делал этого раньше, я застрял в логике того, как изменить ячейку, которую я хочу показать при расширении, потому что метод:

[self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];

ищет правильный путь и вставляет ячейку с тем же xib-файлом ячейки, что и тот, который я загрузил с моими данными в начале

как я могу установить другую ячейку (с другим xib и другими данными) для отображения вместо того же, что и раньше?

в основном у меня эта таблица работает, но в расширяющейся ячейке я вижу копию ячейки, к которой вы прикасаетесь


person Adarkuccio    schedule 11.06.2013    source источник


Ответы (1)


Вы можете сделать это следующим образом:

In .h:

@interface TSViewController : UIViewController
{
    NSMutableArray* subCellIndexPaths;
}

В DataTableViewSubCell.xib создайте одну «Ячейку представления таблицы» (другие представления необходимо удалить). Измените класс для «Пользовательского класса» на DataTableViewSubCell. Повторите это для второй ячейки.

In .m:

- (UITableViewCell*) tableView: (UITableView*) tableView
         cellForRowAtIndexPath: (NSIndexPath*) indexPath
{
    static NSString *CellIdentifier = @"Cell";

    DataTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        if ([subCellIndexPaths containsObject: indexPath])
        {
            NSArray* nib = [[NSBundle mainBundle] loadNibNamed: @"DataTableViewSuperCell"
                                                         owner: nil
                                                       options: nil];

            cell = [nib objectAtIndex: 0];
        }
        else
        {
            NSArray* nib = [[NSBundle mainBundle] loadNibNamed: @"DataTableViewSubCell"
                                                         owner: nil
                                                       options: nil];

            cell = [nib objectAtIndex: 0];
        }
    }

    return cell;
}

- (void) expandCellAtIndex: (int)index
{
    NSMutableArray* indexPaths = [NSMutableArray new];
    NSArray* currentCells = [subCellItems objectAtIndex: index];

    int insertPos = index + 1;

    for (int i = 0; i < [currentCells count]; i++)
    {
        NSIndexPath* indexPath = [NSIndexPath indexPathForRow: insertPos++
                                                    inSection: 0];
        [indexPaths addObject: indexPath];
        [subCellIndexPaths addObject: indexPath];
    }

    [self.tableView insertRowsAtIndexPaths: indexPaths
                          withRowAnimation: UITableViewRowAnimationFade];

    [self.tableView scrollToRowAtIndexPath: [NSIndexPath indexPathForRow: index
                                                               inSection: 0]
                          atScrollPosition: UITableViewScrollPositionTop
                                  animated: YES];

}

И, конечно же, вы должны создавать subCellIndexPath в любом месте (в методах init или viewDodLoad).

person stosha    schedule 12.06.2013
comment
Прежде всего, спасибо за ваш ответ, я хотел бы спросить вас, как я могу подключить IBOutlets ячеек (которые имеют свои отдельные файлы xib и являются разными классами) в файл UIViewController (у которого есть свой собственный xib с UITableView внутри него ), я всегда подключал IBOutlets в соответствующие файлы .h (например, DataTableViewCell.xib в DataTableViewCell.h) - person Adarkuccio; 12.06.2013