gpt4 book ai didi

ios - UITableView:将行,页眉和页脚插入/删除并置

转载 作者:行者123 更新时间:2023-11-29 13:51:21 25 4
gpt4 key购买 nike

考虑具有两个状态之一的非常简单的UITableView。

第一状态:


一个(整体)表脚
一节包含两行,一节标题和一节页脚


第二种状态:


没有表脚
一节包含四行,没有节页眉/页脚


在这两种情况下,每一行实质上都是四个可能的UITableViewCell对象之一,每个对象都包含自己的UITextField。我们甚至不用理会重用或缓存,因为在这种情况下,我们只处理四个已知的单元。它们是在随附的XIB中创建的,因此我们已经将它们全部连接好并准备就绪。

现在考虑我们要在两个状态之间切换。

听起来很简单。假设我们的视图控制器的右栏按钮项提供了切换支持。我们还将使用ivar和枚举跟踪当前状态。

明确地说,这是从状态1到状态2的一种方式。(假设我们也处理了bar按钮项目的标题。)简而言之,我们要清除表的页脚视图,然后插入第三和第四个行。我们将其批处理在一个更新块中,如下所示:

// Brute forced references to the third and fourth rows in section 0
NSUInteger row02[] = {0, 2};
NSUInteger row03[] = {0, 3};

[self.tableView beginUpdates];
state = tableStateTwo; // 'internal' iVar, not a property
self.tableView.tableFooterView = nil;
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObjects:
[NSIndexPath indexPathWithIndexes:row02 length:2],
[NSIndexPath indexPathWithIndexes:row03 length:2], nil]
withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];


相反,我们想重新分配表页脚视图(与单元格一样,它在XIB中处于就绪和等待状态),并删除最后两行:

// Use row02 and row03 from earlier snippet

[self.tableView beginUpdates];
state = tableStateOne;
self.tableView.tableFooterView = theTableFooterView;
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:
[NSIndexPath indexPathWithIndexes:row02 length:2],
[NSIndexPath indexPathWithIndexes:row03 length:2], nil]
withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];


现在,当桌子要排的时候,它已经切得很干。在这两种情况下,前两个单元都相同。根据状态,仅最后两个出现/消失。当“表视图”询问某节中的行数,某节中页眉/页脚的高度或某节中页眉/页脚的高度时,将查询状态ivar。

最后一点也是我遇到麻烦的地方。

使用上述逻辑,第0节的页眉/页脚不会消失。具体来说,页脚停留在插入的行下方,但是页眉现在覆盖了最上面的行。如果我们切换回状态一,则节的页脚将被删除,但节的标题仍将保留。

那么使用 [self.tableView reloadData]怎么样?当然可以,为什么不呢。根据苹果的建议,我们注意不要在更新块中使用它,而只需在 endUpdates之后添加它即可。

这次,好消息!第0节页眉/页脚消失。 :)

但是...

切换回状态会导致最精致的混乱!返回第0部分标题,只是再次覆盖第一行(而不是出现在其上方)。区域0的页脚恰好位于最后一行的下面,但是整个表格的页脚(现已恢复)覆盖了该部分的页脚。 Waaaaaah…现在呢?

可以肯定的是,让我们再次切换回第二种状态。是的,看起来不错。回到状态一? Yecccch。

我还尝试过使用 reloadSections:withRowAnimation:等其他特技,但这只会使情况变得更糟。

NSRange range = {0, 1};
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:range];

...

[self.tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationFade];


恰当的例子:如果我们在更新块结束之前调用 reloadSections...,则将状态更改为状态2会将前两行隐藏起来,即使它们原本会占用的空间仍然存在。切换回状态1,会使第0部分的页眉/页脚恢复正常,但前两行仍然不可见。

情况二:将 reloadSections...移到update块之后但 reloadData之前,导致所有行都变得不可见! (我称该行是不可见的,因为在跟踪过程中, tableView:cellForRowAtIndexPath:返回的是这些行的真实单元格对象。)

情况三:在 reloadSections...之后移动 tableView:cellForRowAtIndexPath:使我们更接近,但是在切换回状态一时,第0节的页眉/页脚从不返回。

嗯根据我在跟踪时看到的内容,也许同时使用 reloadSections...reloadData都是假的,这使我们能够:

情况四:将 reloadData替换为 reloadSections...。状态二的所有单元都消失了。状态一的所有单元也仍然丢失(尽管保留了空间)。

对于该理论来说是如此。 :)

遍历代码,单元格和视图对象以及截面高度,都是在适当时机应处于的位置。他们只是没有理智地渲染。 (更新:视图高度不同,但是我也没有更改它们!请查看我发布的答案以获取更多信息。)

那么,如何破解这种情况?线索欢迎/赞赏!

最佳答案

我今天有同样的问题。

过了一会儿,我想到了一切绘制方式上的错误。在表视图单元格方法的外观中,我像这样删除了条件子句,一切正常:

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


我将仔细研究该问题,因为现在不再对代码进行优化。但这暂时有效。

关于ios - UITableView:将行,页眉和页脚插入/删除并置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2858678/

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