gpt4 book ai didi

ios - 点击单元格时在 UITableViewCell 上打勾

转载 作者:行者123 更新时间:2023-11-28 21:49:44 25 4
gpt4 key购买 nike

我想在点击单元格时在 UITableViewCell 上打复选标记。

但是当点击一个单元格并滚动 tableView 时,其他单元格也会被选中。

(我认为这是因为 UITableViewCell 被重用了。)

我有这个代码。

ViewController.m

@property (nonatomic, strong) NSMutableArray* selectedItems;

- (void)viewDidLoad
{
NSUserDefaults* ud = [NSUserDefaults standardUserDefaults];
self.selectedItems = [NSMutableArray array];
if ([ud objectForKey:@"SelectedItems"] != nil) {
self.selectedItems = [ud objectForKey:@"SelectedItems"];
}
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString* cellIdentifier = @"Cell";
CustomCell* cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;

if (cell.isChecked == YES) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}else if (cell.isChecked == NO) {
cell.accessoryType = UITableViewCellAccessoryNone;
}
return cell;
}

//when tapping the cell, put a check mark
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomCell* cell = (CustomCell *)[tableView cellForRowAtIndexPath:indexPath];
cell.isChecked = YES;
cell.accessoryType = UITableViewCellAccessoryCheckmark;
[self.selectedItems addObject:cell.titleLabel.text];
NSUserDefaults* ud = [NSUserDefaults standardUserDefaults];
[ud setObject:self.selectedItems forKey:@"SelectedItems"];
[ud synchronize];
}

自定义单元格.h

@property BOOL isChecked;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier;


我只想在选定的单元格上打勾。
我该如何解决?

最佳答案

问题是您将已检查/未检查的信息存储在您的单元格中,该单元格是 View ,而不是您的数据源,因此违反了 MVC 的基本原则(模型- View - Controller )范例。

相反,在您的 cellForRowAtIndexPath 中,您必须检查存储在用户默认值中的数据,然后决定是否应检查该单元格。

此外,我们假设您的类中有一个实例变量,它在加载 View 时从用户默认值读取数据,而不是访问每个单元格的用户默认值。还假设您的数据源具有这种结构(字典数组):

@[@"text" : @"firstCellText",  @"checked" : @NO},
@"text" : @"secondCellText", @"checked" : @YES}]

您当然可以通过多种不同的方式来执行此操作,因此以上内容仅用于说明。

// cellForRowAtIndexPath
cell.accessoryType =
[datasource[indexPath.row][@"checked"] boolValue] ?
UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;

关于ios - 点击单元格时在 UITableViewCell 上打勾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28792311/

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