【问题标题】:UITableview buttons getting highlighted on scrollUITableview 按钮在滚动时突出显示
【发布时间】:2020-12-25 13:00:46
【问题描述】:

我的表格视图单元格中有切换按钮,我在某些单元格上单击它们,但是当我向下滚动时,即使我还没有选择它们,也会为底部单元格选择相同的按钮。我知道这是因为 tableview 重用了单元格...有什么办法可以解决这个问题吗?

单元格是动态的,而不是静态的。

tableview 的样子

** 编辑:另外,请让我知道我的逻辑是否正常:我尝试在我的视图控制器类中创建一个可变数组,然后将它的所有值设置为@“0”。然后,在我的 tableviewcell 类中,如果我选择按钮,我将数组中的值设置为当前单元格索引处的 @"1",然后回到我的 viewcontroller 类,我可以判断我是否已经选择了一个按钮在那个牢房与否。唯一的缺陷是我无法访问我的 tableviewcell 类中的数组,它以 null 出现......我猜这是因为目标 c 中的 mvc 模式。有什么建议吗?

编辑

我仍然无法解决我的问题。有人可以帮帮我吗?我已经坚持了一段时间了!

我正在尝试创建一个表格视图,其中单元格有一个复选和交叉按钮,当我单击复选按钮时,它应该变成绿色,但其他单元格中的相同按钮应该保持灰色,但是,当我向下滚动时,一些我没有选择按钮的单元格仍然变成绿色......因为单元格回收。

我现在正在使用委托和协议,但它不起作用;也许我用错了?

我在我的单元格类的 IBaction 函数中设置 yesChecked 值,在我的视图控制器类中,我使用该 yesChecked 值根据按钮是“是”还是“否”来查看按钮的颜色。

请帮忙!谢谢!

@protocol DetailsTableViewCellDelegate <NSObject>

- (void) customCell:(DetailsTableViewCell *)cell yesBtnPressed:(bool)yes;

@property (nonatomic, retain) NSString * yesChecked;

【问题讨论】:

    标签: ios objective-c uitableview uibutton


    【解决方案1】:

    您必须在cellForRowAt 中选择或取消选择它们。例如,如果您的单元格具有 leftButton 属性并且您有这样的模型,您可以执行以下操作:

    @interface Model : NSObject
    
    @property (nonatomic, assign) BOOL selected;
    
    @end
    
    @protocol CustomCellDelegate <NSObject>
    
    - (void)cellActionTapped:(UITableViewCell *)cell;
    
    @end
    
    @interface CustomCell : UITableViewCell
    
    @property (nonatomic, assign) BOOL leftButtonSelected;
    @property (weak, nonatomic, nullable) id<CustomCellDelegate> delegate;
    
    @end
    
    // ModelViewController.h
    @interface ModelViewController : UIViewController<CustomCellDelegate>
    
    @end
    
    // ModelViewController.m
    @interface ViewController () {
        NSArray<Model*>* models;
    }
    
    @end
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuseIdentifier"];
        ((CustomCell *)cell).delegate = self;
        ((CustomCell *)cell).leftButtonSelected = models[indexPath.row].selected;
        return cell;
    }
    
    - (void)cellActionTapped:(UITableViewCell *)cell {
        NSIndexPath *indexPath = [tableView indexPathForCell:cell];
        // Update data source using (maybe) indexPath.row
    }
    

    【讨论】:

    • 谢谢!但我正在使用objective-c
    • 另外,让我知道我的逻辑是否正常:我尝试在我的视图控制器类中创建一个可变数组,然后将它的所有值设置为 @"0"。然后,在我的 tableviewcell 类中,如果我选择按钮,我将数组中的值设置为当前单元格索引处的 @"1",然后回到我的 viewcontroller 类,我可以判断我是否已经选择了一个按钮在那个牢房与否。唯一的缺陷是我无法访问我的 tableviewcell 类中的数组,它以 null 出现......我猜这是因为目标 c 中的 mvc 模式。有什么建议吗?
    • 在 Obj-C 中基本相同,但我已经更新了我的答案。您应该在您的单元格中实现一个委托,以便您的单元格中的点击更新 ViewController 中的数据源。考虑到单元格的可重用特性,在单元格级别拥有数据源是行不通的。
    • 您好,感谢您的回复!很抱歉再次打扰您,我无法确定单元格的委托,您能否提供一些示例代码或发送有用的链接?
    • 我更新了答案以包含代表的示例。您将不得不根据您想要实现的目标更改参数和逻辑,但我认为这会让您对方法有一个大致的了解。
    猜你喜欢
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多