- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在重用标题,将它们保存在字典中,其中节号是键,标题 View 是值。
在我删除一个部分并重新加载另一个部分后,只有这些部分的标题 View “消失”了。经过一番搜索,我发现这些标题 View 的框架已更改。 Frame.X
使用 UITableViewRowAnimationRight
删除的部分的标题 View 按屏幕宽度 (320) 向右移动,以及用 UITableViewRowAnimationAutomatic
重新加载的那个由 Y
转移.
主要的问题和困惑来自于我无法更改这些框架!好吧,它们一开始会发生变化,但在视觉上和在 viewForHeaderInSection:
的另一个调用中没有任何变化。帧再次移动。
这是我的做法:
假设我们有 3 个部分,每个部分的数据位于一个数组 _first
中, _second
和 _third
.通过按钮的触摸我们调用handleTouchUp:
. (_second
保持不变)
- (void) handleTouchUp: (UIButton *)sender
{
if ([_first count] == 0) {
sectionCount = 3;
_first = [NSMutableArray arrayWithObjects: @"First 1", @"First 2", nil];
_third = [NSMutableArray arrayWithObjects: @"Third 1", @"Third 2", @"Third 3", @"Third 4", @"Third 5", nil];
[tableView reloadData];
} else {
sectionCount = 2;
[_first removeAllObjects];
_third = [NSMutableArray arrayWithObjects: @"First 1", @"First 2", @"Third 1", @"Third 2",
@"Third 3", @"Third 4", @"Third 5", nil];
[tableView beginUpdates];
[tableView deleteSections: [NSIndexSet indexSetWithIndex: 0] withRowAnimation:UITableViewRowAnimationRight];
[tableView reloadSections: [NSIndexSet indexSetWithIndex: 2] withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView endUpdates];
}
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
NSNumber *key = [NSNumber numberWithInteger: section];
UIView *header = [_headers objectForKey: key];
if (header) {
} else {
header = [[UIView alloc] init];
switch (section) {
//Doing something with header here (e.g. set background color)
}
[_headers setObject:header forKey: key];
}
[header setFrame: CGRectMake(0, 0, 320, 25)];
return header;
}
Here is full code of ViewController.m和 test project
更新:项目中可能还有其他一些错误,但这并不重要——它是测试项目。唯一重要的问题是无效的标题 View 。删除无效 View 并创建新 View 不是解决方案——它扼杀了重用标题 View 的意义。
最佳答案
我在您的项目中发现了几个错误,这些错误实际上导致了一些崩溃,我相信它们也对您在应用程序中看到的标题 View 错误负责。在我修复这些问题之后,应用程序对我来说似乎可以正常运行。
这是您项目的更新版本:https://bitbucket.org/reydan/tableheaderviews
我尽量保持它与您最初的项目相似,但我不得不进行一些更改。如果您认为它不符合您想要的功能,请发表评论,我会更新(这是我推断该项目应该表现的样子)下面解释的所有更改也可以在此更新的项目中看到。
我发现的问题与以下事实有关:如果您从 TableView 中删除一个部分,则它之后的所有部分的索引都会更改(-1)。这是正常的,因为部分索引实际上是一个索引,而不是分配给每个部分的唯一键。
删除第一部分后,第三部分现在有索引 = 1,并且 TableView 委托(delegate)方法错误地读取数据(包括标题 View ),因为您的所有内容都基于部分索引。
为了解决这个问题,我更改了 header View 缓存以使用数据数组作为键(_first、_second 或 _third)。为了使这更容易,我创建了一个可以从多个地方调用的方法,并根据节索引和当前节数返回正确的数据数组:
- (NSArray*)dataArrayForSection:(NSInteger)section
{
if (sectionCount == 3)
{
switch (section)
{
case 0: return _first;
case 1: return _second;
case 2: return _third;
}
}
else
{
switch (section)
{
case 0: return _second;
case 1: return _third;
}
}
return nil;
}
现在 header 缓存使用数据数组作为键,在 handleTouchUp
方法中重新分配数组时删除 header 条目很重要。
- (void) handleTouchUp: (UIButton *)sender
{
NSLog(@"Touched!");
if ([_first count] == 0)
{
sectionCount = 3;
// **INSERTED** Removes the cache for the _first and _third keys because you are recreating the arrays again,
// and so you are losing the initial key. Not doing this, results in a memory leak
[_headers removeObjectForKey:_first];
[_headers removeObjectForKey:_third];
_first = [NSMutableArray arrayWithObjects: @"First 1", @"First 2", nil];
_third = [NSMutableArray arrayWithObjects: @"Third 1", @"Third 2", @"Third 3", @"Third 4", @"Third 5", nil];
[tableView reloadData];
// [tableView beginUpdates];
// [tableView reloadSections: [NSIndexSet indexSetWithIndex: 0] withRowAnimation:UITableViewRowAnimationRight];
// [tableView reloadSections: [NSIndexSet indexSetWithIndex: 2] withRowAnimation:UITableViewRowAnimationAutomatic];
// [tableView endUpdates];
}
else
我改进的另一件事是重用表格 View 单元格。您应该始终尝试并重用现有的 UITableViewCells(除了少数异常(exception))。 cellForRowAtIndexPath
现在看起来像这样:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSArray* dataarray = [self dataArrayForSection:indexPath.section];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"my_text_cell"];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"my_text_cell"];
if (dataarray == nil)
cell.textLabel.text = @"default";
else
cell.textLabel.text = [dataarray objectAtIndex:indexPath.row];
return cell;
}
如果您有任何问题,请发表评论。
编辑
我尝试按照您的要求更新我的测试项目,以保持缓存完好无损,并且我确实能够重现该错误 - 在删除/重新加载动画之后,最后一部分的标题不可见。
我发现iOS选择的Automatic reload动画是Fade动画。这会导致标题 View 淡出。我通过在应用程序中添加另一个按钮来测试这一点,该按钮为所有缓存的标题 View 设置 alpha=1 。重新加载动画后,我按下此按钮,标题 View 正确显示。
我尝试使用其他动画,但效果不佳。
最后,我认为 Apple 不建议缓存标题 View 。在文档中,从 iOS 6.0 开始,有一种解决此问题的新方法。它的行为类似于出列单元格,但用于页眉/页脚 View - (id)dequeueReusableHeaderFooterViewWithIdentifier:(NSString *)identifier
因此,如果您的目标是 iOS 6.0+,那么您可以使用它来代替手动缓存 header 。否则,我找到的解决方案是仅从缓存中删除已删除和重新加载部分(_first 和 _third)的标题 View 。
我更新了项目以在刷新时仅删除最后一节标题
关于ios - 删除 UITableView 的部分后标题 View 的框架永远改变了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16979150/
我有以下MWE function f(p) ans = zeros(p, 2) return ans end ans = f(2) ans b=ans.+1.0 ans 起初,ans是正确的,
OWIN AppBuilder“UseStatic”位从本地文件系统传送文件,这在某些情况下很方便,但我希望它从我在应用程序启动时预先填充的内存中 IDictionary 传送内容。任何人都可以指出一
我是 JavaScript 新手。 我的代码允许我列出 JSON 文档的元素及其类型,并将所有元素连接到一个字符串 donnees_types 中。 问题是 JavaScript 中的 typeof
我想在每次刷新时更改主页上的背景图像。我怎样才能做到这一点?我认为 jquery 是可能的,但我不太清楚。 感谢您对此主题的任何帮助或评论。 最佳答案 我不知道“如何”,但我找到了以下链接: http
所以我已经在这上面花了几个小时了,老实说我完全陷入困境。我写了一个 for 循环来计算整数中的数字数量,但我发现一旦我输入 10 位以上的数字,除数值就会发生变化,而且我不明白为什么。我在互联网上搜索
当我在使用表面 View 的游戏 Activity 和使用膨胀菜单的其他 Activity 之间切换时,我会收到错误消息。 日志猫: 07-13 15:15:34.464: ERROR/Android
听说很简单 R*=f; G*=f; B*=f; 其中 f 是标量值 0 .. 1.0 或更大改变亮度的方法不太正确颜色,但我找不到一些代码片段获得更好的东西(无需太多学习色彩理论)也许有人可以在这里给
如以下链接所述:- How to get the ThreadPoolExecutor to increase threads to max before queueing? 我将队列实现更改为在进入
我只显示最初提供 20 分钟 slotMinutes 的日历。我试图让用户即时更改为 10 分钟的 slotMinutes。 我有一个触发以下代码的按钮: $('#calendar').fullCal
我的问题是:我的应用程序中有一个新闻列表(UITableView)当我点击 1 个"new"时,我打开它,里面有一个后退按钮,可以让我回到列表。现在的问题是我必须在滑动时实现"new"更改,所以我制作
我面临着与 I'm trying to install psycopg2 onto Mac OS 10.6.3; it claims it can't find "stdarg.h" but I ca
需要通过为 array2 中不存在的索引设置 visible false 来从 array1 创建一个新的 array3。 在下面的示例中,我有索引 0,2。所以对于 1,3,结果数组必须具有 vis
我有一个对象,类似这样 var Egg = function(){ this.test = $(.slider .label); $('.slider').slider({
我想改变 ScrollView 的宽度。首先,我这样做了: var scrollWidthConstraint: NSLayoutConstraint! 然后设置它: scrollWidthConst
我有两个动画,一个是“过渡”,它在悬停时缩小图像,另一个是 animation2,其中图像的不透明度以周期性间隔重复变化。 我有 animation2 在图像上进行,当我将鼠标悬停在它上面时,anim
我是一个 jQuery 新手,一直在尝试添加一个脚本来更改 div onClick 的 id。 这是一个jsfiddle example . $(function accept() { $("
我正在尝试更改用户输入的字母的大小写,并将该字母的小写和大写版本存储在变量中。我已经编写了下面的代码,但它在运行时遇到了问题。有人指出是什么导致了问题吗? #include #include #i
假设我有这段代码: char num[2] = {15, 240}; char* p_num; 现在,如果我理解的一切正确,数组中的位应该像这样对齐: 00001111 11110000 我的问题是
var html = '' + count + '' + i.Description + '' + i.Priority + '' + i.Status + 'johnsmith- ' + creat
我在虚拟机上安装了 minix3,并希望我可以操纵当前的队列选择算法,以便我可以将其从优先级顺序更改为包括随机分类的低优先级作业的优先级顺序。我发现我需要更改的代码部分在 proc.c 中,具体部分是
我是一名优秀的程序员,十分优秀!