静态单元格内的动态UITableView

时间:2013-12-26 00:23:45

标签: ios objective-c uitableview

我已经阅读了一些关于静态& amp;动态细胞不兼容,但我想知道我的病例是否有一些解决方法。

我有一个静态表(由UITableViewController处理)。我在其中一个单元格中放置了一个动态表格。代表和datasource是两个表的UITableViewController,只要内部动态表的行数小于静态表,它就能很好地工作。当动态表具有比静态表更多的单元格时,我会得到index i beyond bounds异常。

我假设某些单元格的总数被静态定义并由两个表共享,但无法真正理解究竟发生了什么。有人遇到类似的问题并找到了解决方法吗?

修改

这是我的numberOfRowsInSection方法。在我的委托/数据源的每个方法中,我检查调用表是动态表(_tableOptions)还是静态表(在这种情况下,我调用父方法)。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (tableView == _tableOptions) {
        // I return here the number of rows for the dynamic inner table
    } else {
        return [super tableView:tableView numberOfRowsInSection:section];
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (tableView == _tableOptions) {
        static NSString *simpleTableIdentifier = @"cellOptions";

        CellOptions *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

        // Doing some stuff with my cell... 

        return cell;

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

1 个答案:

答案 0 :(得分:6)

这不是兼容性问题。如果您选择为静态UITableViews实现编程控制功能,那么您必须确保不会在故事板中定义它们的方式。

例如,如果为具有静态单元格的UITableView实现此功能

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
     return 5;
}

但是你只为故事板中的给定视图和控制器添加了3个静态单元格,然后Xcode不能简单地从零创建2个静态单元格。我认为最接近解决方法的是为动态单元格的表添加另一个UITableViewController。您可以在当前使用的控制器中实例化新控制器,而无需在屏幕上显示其视图。然后,您可以将具有动态单元格的UITableView指定为新的UITableViewController的tableView属性。同样,将UITableView的委托和数据源属性指定为新控制器。

编辑:看到代码后,我知道一种可能的解决方法。您可以利用部分数量来欺骗UITableViewController,使其成为您想要的。

您可以使用下面的代码向动态视图添加任意数量的单元格,因为您将单元格添加到动态表格的第二部分,但同时将静态表格第二部分中的单元格数量设置为0关键是你必须将最大单元格数添加到故事板中静态表的第二部分。这些将是永不显示的虚拟单元格。

在下图中,您可以看到我将静态表的第二部分设置为10个单元格,在代码中我可以为dynamic tableview返回最多10个单元格。

enter image description here

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    if (tableView == dynamic)
    {
        return 2;
    }
    else
    {
        return 1;
    }
}

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (tableView == dynamic) {
        static NSString *simpleTableIdentifier = @"sample";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

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

        [cell.textLabel setText:[NSString stringWithFormat:@"cell %d",indexPath.row]];

        // Doing some stuff with my cell...

        return cell;
    }
    else
    {
        return [super tableView:tableView cellForRowAtIndexPath:indexPath];
    }
}

您可以通过实现此功能来清除部分标题:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 0;
}

删除部分的标题后,您将获得正在尝试完成的内容。静态表的第三个单元格内的dynamic表中有10个单元格。

enter image description here