为啥我的 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单元格上留下滑动删除按钮打开然后返回导致崩溃

ios UITableview 单个单元格上的多个选择选项?

UITableView 单元格上的 Peek 和 Pop 使用 UISearchController 失败