tableView上的复选标记[重复]
Posted
技术标签:
【中文标题】tableView上的复选标记[重复]【英文标题】:Checkmark on tableView [duplicate] 【发布时间】:2017-07-12 05:50:32 【问题描述】:我有以下实现,用户可以根据需要选择任意数量的项目。
一旦用户选择项目,我就可以看到复选标记,但是当用户向上或向下滚动时,会出现奇怪的行为,因为我看到其他项目也被选中,即使它没有被选中。
例如,如果我按顺序选择 3 个项目,当我向下滚动时,我可以看到相同的模式(按顺序选择 3 个项目)。是否与dequeueReusableCellWithIdentifier
有关?如果是,我做错了什么?
- (void)viewDidLoad
[super viewDidLoad];
self.comboTableView.allowsMultipleSelection = YES;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
[comboTableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
[comboTableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone;
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return movies.count;
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return ((Section*)movies[section]).movies.count ;
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
cell.textLabel.text = ((Section*)movies[indexPath.section]).movies[indexPath.row];
return cell;
【问题讨论】:
重复***.com/questions/23727255/… 【参考方案1】:UITableView Cells
被重用,因为您使用的是dequeueReusableCellWithIdentifier:cellIdentifier
。所以你必须检查当前索引路径项是否被选中。如果选中,则启用刻度线。否则禁用它
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
NSArray <NSIndexPath*> *selectedIndexPaths = [tableView indexPathsForSelectedRows];
if ([selectedIndexPaths containsObject:indexPath])
// Add the code of enable tick mark
else
// Add the code of disable tick mark
【讨论】:
【参考方案2】:这个问题是因为您“检查 tableviewcell”而不是您的数据。 所以如果你不记录这个检查信息,即使这个cell实例改变为呈现不同indexPath的不同数据,你的tableviewcell也会记录检查状态。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
[comboTableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
((Section*)movies[indexPath.section]).movies[indexPath.row].checked = true;
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
[comboTableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone;
((Section*)movies[indexPath.section]).movies[indexPath.row].checked = false;
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
cell.textLabel.text = ((Section*)movies[indexPath.section]).movies[indexPath.row];
cell.accessoryType = ((Section*)movies[indexPath.section]).movies[indexPath.row].checked ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
return cell;
【讨论】:
我真的是通过在模型类中添加另一个变量来跟踪数据中的每个选择,还是让 tableview 为我处理它?我赞成你的努力 是的,你应该记录,因为 tableview 不会为你处理这个。这就是你困惑的原因。[tableView indexPathsForSelectedRows]
存储选定的 section
和 row
(indexPath),不是吗?
你的话我弄错了。是的,您可以使用 [tableView indexPathsForSelectedRows]。
是的,我同意!你是对的! :)以上是关于tableView上的复选标记[重复]的主要内容,如果未能解决你的问题,请参考以下文章
TableView Cell 重用和不需要的复选标记 - 这让我很生气
如何在单元格渲染后检查表格视图上的复选标记图标(附件视图)?