0

我做了一个填充了 plist 数据源的 UITableView,我用 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 和不同的数据)来显示而不是像以前一样?

基本上我有这张桌子工作,但在扩展单元格中,我看到你触摸的单元格的副本

4

1 回答 1

0

你可以这样做:

在.h中:

@interface TSViewController : UIViewController
{
    NSMutableArray* subCellIndexPaths;
}

在 DataTableViewSubCell.xib 中创建一个“表格视图单元格”(您必须删除的其他视图)。将“自定义类”的类更改为 DataTableViewSubCell。重播第二个单元格。

以 .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];

}

当然,您必须在任何地方创建 subCellIndexPaths(在 init 或 viewDodLoad 方法中)。

于 2013-06-12T04:46:51.990 回答