UITableview 按钮在滚动时突出显示

UITableview buttons getting highlighted on scroll

提问人:JJ S. 提问时间:9/5/2020 最后编辑:JJ S. 更新时间:9/8/2020 访问量:207

问:

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

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

TableView 的外观

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

编辑

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

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

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

我在单元格类的 IBaction 函数中设置了 yesChecked 值,在我的 viewcontroller 类中,我使用该 yesChecked 值来查看根据按钮是“是”还是“否”为按钮赋予什么颜色。

请帮忙!谢谢!

@protocol DetailsTableViewCellDelegate <NSObject>

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

@property (nonatomic, retain) NSString * yesChecked;
iOS Objective-C UITableView UIBuint

评论


答:

1赞 Lalo 9/5/2020 #1

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

@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
}

评论

0赞 JJ S. 9/5/2020
谢谢!但我使用的是objective-c
0赞 JJ S. 9/5/2020
另外,我知道我的逻辑是否正常:我尝试在我的 viewcontroller 类中创建一个可变数组,然后将其所有值设置为 @“0”。然后,在我的 tableviewcell 的类中,如果我选择按钮,我将数组中的值设置为当前单元格索引处的 @“1”,然后回到我的 viewcontroller 类中,我可以判断我是否已经在该单元格中选择了按钮。唯一的缺陷是我无法访问我的 tableviewcell 类中的数组,它以 null 出现......我猜这是因为目标 C 中的 MVC 模式。 有什么建议吗?
0赞 Lalo 9/5/2020
在 Obj-C 中基本相同,但我已经更新了我的答案。您应该在单元格中实现委托,以便单元格中的点击更新 ViewController 中的数据源。鉴于单元格的可重用性,在单元级别拥有数据源是行不通的。
0赞 JJ S. 9/7/2020
您好,感谢您的回复!很抱歉再次打扰您,我无法确定单元格的委托,您能为我提供一些示例代码或发送有用的链接吗?
0赞 Lalo 9/8/2020
我更新了答案,以包含一个委托的示例。你必须根据你想要实现的目标来改变参数和逻辑,但我认为这将使你对方法有一个大致的了解。