gpt4 book ai didi

ios - 静态单元格内的动态 UITableView

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:08:48 25 4
gpt4 key购买 nike

我已经阅读了一些关于静态和动态单元格不兼容的帖子,但我想知道是否有适合我的情况的解决方法。

我有一个静态表(由 UITableViewController 处理)。我在其中一个单元格中放置了一个动态表。委托(delegate)和数据源是两个表的 UITableViewController,只要内部动态表的行数少于静态表,它就可以很好地工作。当动态表的单元格多于静态表时,我得到一个 index i beyond bounds 异常。

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

编辑

这是我的 numberOfRowsInSection 方法。在我的委托(delegate)/数据源的每个方法中,我检查调用表是动态表 (_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];
}
}

最佳答案

这不是兼容性问题。如果您选择为静态 UITableView 实现编程控制功能,那么您必须确保您不会与它们在 Storyboard中的定义方式发生冲突。

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

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

但是您只为 Storyboard 中的给定 View 和 Controller 添加了 3 个静态单元格,那么 Xcode 不能简单地从无到有再创建 2 个静态单元格。我认为最接近解决方法的是为带有动态单元格的表添加另一个 UITableViewController 。您可以在您正在使用的当前 Controller 中实例化新 Controller ,而无需在屏幕上显示其 View 。然后,您可以将具有动态单元格的 UITableView 指定为新的 UITableViewController 的 tableView 属性。同样,将 UITableView 的委托(delegate)和数据源属性指定为新 Controller 。

编辑:在看到代码后,我知道了一种可能的解决方法。您可以利用部分的数量来欺骗 UITableViewController 执行您想要的操作。

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

在下图中,您可以看到我将静态表格的第二部分设置为 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;
}

删除部分的标题后,您将得到您想要完成的目标。在静态表的第三个单元格内的动态表中有 10 个单元格。

enter image description here

关于ios - 静态单元格内的动态 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20777878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com