我已经阅读了一些关于静态& 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];
}
}
答案 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个单元格。
- (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个单元格。