UITableviewcell 内容更新体现

Posted

技术标签:

【中文标题】UITableviewcell 内容更新体现【英文标题】:UITableviewcell content updating reflects 【发布时间】:2016-05-02 09:22:32 【问题描述】:

我在UITableViewCell 的每一行中添加了三个UIButtons

当我选择UIButton 时,它会将其颜色更改为黑色。问题是这些颜色变化受到了表格中其他单元格按钮的影响,我在向下滚动表格时才看到它。

这个链接也解释了同样的问题->UITableviewcell content updating reflects to other cell

我在 ios 中找不到此问题的任何答案。

这是我的 cellForRowAtIndexPath

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"custCell"];

    UIButton *btn1=[cell viewWithTag:101];
    btn1.imageView.contentMode = UIViewContentModeScaleAspectFit;
    [btn1 addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
    btn1.backgroundColor=[UIColor clearColor];
    [btn1 setTag:(indexPath.row*3)+1];

    UIButton *btn2=[cell viewWithTag:102];
    btn2.imageView.contentMode = UIViewContentModeScaleAspectFit;
    [btn2 addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
    btn2.backgroundColor=[UIColor clearColor];
    [btn2 setTag:(indexPath.row*3)+2];

    UIButton *btn3=[cell viewWithTag:103];
    btn3.imageView.contentMode = UIViewContentModeScaleAspectFit;
    [btn3 addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
    btn3.backgroundColor=[UIColor clearColor];
    [btn3 setTag:(indexPath.row*3)+3];
rerutn cell;

这是我的按钮操作方法

- (IBAction)btnClicked:(id)sender

    UIButton *button=(UIButton *)sender;
    NSLog(@"tag %ld",(long)button.tag);
    if(button.backgroundColor==[UIColor blackColor])
        button.backgroundColor=[UIColor clearColor];

    
    else if(button.backgroundColor==[UIColor clearColor])
        button.backgroundColor=[UIColor blackColor];
    

这段代码没有什么花哨的。我怎样才能以编程方式解决这个问题..谢谢..!

【问题讨论】:

UITableviewcell content updating reflects to other cell的可能重复 是的。你有什么解决办法??? 在 cellforrowatindex 中使用与 IBAction 中相同的方法 【参考方案1】:

替换

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"custCell"];

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"custCell" forIndexPath:indexPath];

        if (cell == nil)

            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"custCell"];
        

希望它会有所帮助:)

【讨论】:

和以前一样。不影响任何人。问题沙爹一样【参考方案2】:

制作 UITableViewCell 并添加 UIButton 并用故事板标记它们。

@interface TblCellCategoryCell:UITableViewCell

@property (weak, nonatomic) IBOutlet UIButton *btn1;
@property (weak, nonatomic) IBOutlet UIButton *btn2;
@property (weak, nonatomic) IBOutlet UIButton *btn3;

@end

【讨论】:

【参考方案3】:

在 cellForRowatIndexPth 而不是这一行

btn1.backgroundColor=[UIColor clearColor];

使用下面的代码

if (btn1.isSelected) 
    btn1.backgroundColor=[UIColor clearColor];

else
    btn1.backgroundColor=[UIColor blackColor];

在 IBAction 中使用

 UIButton *button=(UIButton *)sender;
 if(button.backgroundColor==[UIColor blackColor])
    button.backgroundColor=[UIColor clearColor];
    [button setSelected:YES];

else
    button.backgroundColor=[UIColor blackColor];
    [button setSelected:NO];

【讨论】:

这不起作用。当 viewWithTag 创建按钮时,我已经更改了按钮的颜色。 你可以在单元格中添加子视图,而不是使用标签值调用,否则你可以使用 tableviewcell 子类【参考方案4】:

这是因为UITableView 重复使用单元格而不是创建新单元格。因此,假设您使用索引 2 更改单元格的颜色,因此每当 UITableView 重用该单元格时,它将显示先前创建的带有更改颜色按钮的单元格。

对于您的具体问题,您总是在重置按钮的标签,因此下次您尝试从 viewWithTag 获取按钮时,它根本不会返回任何按钮,或者会返回错误的按钮。

【讨论】:

那么有什么解决办法吗?? 您是使用 Storyboard 文件或 nib 文件来创建单元格还是在代码中创建单元格? 我正在使用 StoryBoard.. 如果我以编程方式创建单元格会解决吗 仅使用 Storyboard,创建 UITableViewCell 的子类并使用控件从按钮拖动到 UITableViewCell 子类以在代码中生成按钮的引用,然后使用这些引用而不是使用 viewWithTag

以上是关于UITableviewcell 内容更新体现的主要内容,如果未能解决你的问题,请参考以下文章

保存 UITableviewcell accessoryView 的状态

dequeueReusableCellWithIdentifier、自定义 UITableViewCell 的问题

从 uitableviewcell 获取文本输入

使用带有原型单元的自定义 UITableViewCell

滚动后 UITableViewCell 标签发生变化[重复]

使用自定义 UITableViewCell 时,imageview 框架为零