为啥我的 UITableView 单元格上的这个按钮会重新绘制自己?
Posted
技术标签:
【中文标题】为啥我的 UITableView 单元格上的这个按钮会重新绘制自己?【英文标题】:Why does this button on my UITableView cell repaint itself?为什么我的 UITableView 单元格上的这个按钮会重新绘制自己? 【发布时间】:2011-06-15 18:22:20 【问题描述】:我的表格视图单元格上有一个按钮。 但是滚动按钮后看起来像这样:
看起来有时一个按钮在另一个之上。 我怎么解决这个问题?
这是我在cellForRowAtIndexPath
中的按钮代码
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Chapter *chapter = nil ;
UITableViewCell *cell = nil;
NSUInteger row = [indexPath row];
switch (indexPath.section)
case 0:
chapter = [[einfuerung objectAtIndex:row]retain];
break;
case 1:
chapter = [[vertiefung objectAtIndex:row]retain];
break;
case 2:
chapter = [[spezial objectAtIndex:row]retain];
break;
if ([self filesFromFolderWithChapter:chapter] > 1)
static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
cell = [tableView dequeueReusableCellWithIdentifier: SimpleTableIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:SimpleTableIdentifier] autorelease];
else
static NSString *ButtonTableIdentifier = @"ButtonTableIdentifier";
cell = [tableView dequeueReusableCellWithIdentifier: ButtonTableIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ButtonTableIdentifier] autorelease];
NSString *firstString;
NSString *lastString;
switch (indexPath.section)
case 0:
chapter = [[einfuerung objectAtIndex:row]retain];
[dataInstance extractFromString: [chapter title]: &firstString: &lastString];
cell.textLabel.text = firstString;
cell.detailTextLabel.text = lastString;
cell.backgroundColor = [UIColor whiteColor];
break;
case 1:
chapter = [[vertiefung objectAtIndex:row]retain];
[dataInstance extractFromString: [chapter title]: &firstString: &lastString];
cell.textLabel.text = firstString;
cell.detailTextLabel.text = lastString;
cell.backgroundColor = [UIColor whiteColor];
break;
case 2:
chapter = [[spezial objectAtIndex:row]retain];
[dataInstance extractFromString: [chapter title]: &firstString: &lastString];
cell.textLabel.text = firstString;
cell.detailTextLabel.text = lastString;
cell.backgroundColor = [UIColor whiteColor];
break;
if ([self filesFromFolderWithChapter:chapter] > 1)
//VersionButton *button = [VersionButton buttonWithType:UIButtonTypeRoundedRect];
VersionButton *button = [[VersionButton alloc]initWithFrame:CGRectMake(500, 15, 150, 30) andTitle:@"ältere Versionen"];
button.chapter = chapter;
[button addTarget:self action:@selector(versionTapped:)
forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:button];
[button release];
[chapter release];
return cell;
【问题讨论】:
【参考方案1】:首先,查看整个 cellForRowAtIndexPath 函数会很有帮助。
您似乎没有正确考虑单元重用。如果您是从头开始创建一个单元格,而不是在重复使用一个单元格时,您应该只向您的单元格添加一个按钮。如果一个单元格被重复使用,您应该有办法访问它已有的按钮并对其进行任何必要的更改。
【讨论】:
添加了整个代码。我有两个版本的单元格,一个有按钮,一个没有。但是如何访问重复使用的单元格的按钮?我必须子类化吗? 我会设置按钮的标签值。myButton.tag = 2;
然后你可以通过向重复使用的单元格询问其带有标签#2 的子视图来再次找到该按钮,这将是按钮(参见 UIView 文档)。
另外,我不知道您的章节类是如何设置的,但是当您从 vertifung 数组中拉出它们时,您可能不需要保留。您可能正在泄漏内存。
好的,谢谢。但我想我只需要查看单元格并检查是否有子视图。然后我只需要用新章节替换按钮中的章节。这应该可以解决问题,不是吗?
@leaking 我需要保留。我以前没有它,但我遇到了分段错误,在日志中什么也没告诉我。【参考方案2】:
您是否在其他地方调用 setNeedsDisplay 会导致它调用 drawRect?
【讨论】:
以上是关于为啥我的 UITableView 单元格上的这个按钮会重新绘制自己?的主要内容,如果未能解决你的问题,请参考以下文章
UItableview 在自定义单元格上使用带有提示的警报视图重新加载数据的问题
UITableView 单元格未显示放置在自定义单元格上的 UITableView(KPDropDown)
在uitableview单元格上留下滑动删除按钮打开然后返回导致崩溃