gpt4 book ai didi

ios - UITableView 的自定义 CheckBoxView 复制复选标记

转载 作者:行者123 更新时间:2023-11-28 19:52:01 25 4
gpt4 key购买 nike

我已经为我的 UITableViewCell 创建了一个 CheckBoxView 控件。我面临的问题是,一旦我勾选其中一个顶行并滚动,在底行上就可以看到相同的复选标记。这是因为 dequeueresuable 行功能,我想知道如何修复它。这是实现。

CheckBoxView.m:

-(instancetype) initWithCoder:(NSCoder *)aDecoder {

self = [super initWithCoder:aDecoder];
[self setup];
[self registerGesturesRecognizers];
return self;
}

-(void) registerGesturesRecognizers {

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(checkBoxTapped:)];

[self addGestureRecognizer:tapGestureRecognizer];
}

-(void) checkBoxTapped:(UITapGestureRecognizer *) recognizer {

if(self.checkBoxViewSelectionChanged) {
if(!self.isChecked) {
self.checkBoxViewSelectionChanged(self,self.isChecked);
self.isChecked = YES;
}
else {
self.checkBoxViewSelectionChanged(self,self.isChecked);

}
}
}

-(void) check {

[_checkBoxImageView setImage:[UIImage imageNamed:@"small-check"]];

}

-(void) uncheck {

_checkBoxImageView.image = nil;
}

-(void) setup {

self.userInteractionEnabled = YES;
self.layer.borderWidth = 0.5f;
self.layer.borderColor = [UIColor lightGrayColor].CGColor;

_checkBoxImageView = [[UIImageView alloc] initWithFrame:CGRectMake(1, 0, 23, 23)];
[self addSubview:_checkBoxImageView];
}

这里是 cellForRowAtIndexPath 方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

SamplesTableViewCell *cell = (SamplesTableViewCell *) [tableView dequeueReusableCellWithIdentifier:@"SamplesTableViewCell" forIndexPath:indexPath];

Item *sample = [_samples objectAtIndex:[indexPath row]];

cell.productNameLabel.text = sample.product.name;
cell.productColorLabel.text = sample.productColor.name;
[cell.productImageView setImage:sample.productColor.image];

cell.checkboxView.checkBoxViewSelectionChanged = ^(CheckBoxView *checkBoxView, BOOL isChecked) {

if(!isChecked) {
[checkBoxView check];
checkBoxView.isChecked = YES;
}
else {
[checkBoxView uncheck];
checkBoxView.isChecked = NO;
}

};

return cell;
}

CheckBoxView 实际上是 Storyboard 原型(prototype)单元格上的一个 UIView,其类设置为 CheckBoxView,因此它不是在 cellForRowAtIndexPath 事件中动态创建的。当我运行上面的代码并选中最上面的行并滚动时,相同的选中标记出现在下面的行上。

更新:

这是我更新后的代码,但它仍然检查和取消选中底部的行。

  cell.checkboxView.checkBoxViewSelectionChanged = ^{

if(!sample.isSelected) {

[sample setSelected:YES];
[cell.checkboxView check];
}
else
{
[sample setSelected:NO];
[cell.checkboxView uncheck];
}


};

最佳答案

您的UIView 不应 为您的复选框保持isChecked 状态。正如您所指出的,由于使用了相同的 UIView,因此将检查所有其他单元格的重用。

为数据提供动力的模型对象需要维护状态或您的 Controller 。

例如:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

SamplesTableViewCell *cell = (SamplesTableViewCell *) [tableView dequeueReusableCellWithIdentifier:@"SamplesTableViewCell" forIndexPath:indexPath];

// Some code...

if ([self.myDatasource[indexPath.row] isChecked]) {
cell.checkBoxView.isChecked = YES;
}

return cell;
}

只是一些粗略的伪代码,但希望您能理解。实现此状态的潜在方法是采用模型对象的形式,或者在您的 UIViewController 中有一个 NSArray 包含代表每一行的 NSDictionary在您的 UITableView 中,每个键值对都为您的 UITableViewCell 维护一个特定的状态。

关于ios - UITableView 的自定义 CheckBoxView 复制复选标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28685098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com