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] 存储选定的 sectionrow (indexPath),不是吗? 你的话我弄错了。是的,您可以使用 [tableView indexPathsForSelectedRows]。 是的,我同意!你是对的! :)

以上是关于tableView上的复选标记[重复]的主要内容,如果未能解决你的问题,请参考以下文章

TableView Cell 重用和不需要的复选标记 - 这让我很生气

设置静态表格视图单元格的复选标记

使附件类型成为选定单元格的复选标记

如何在单元格渲染后检查表格视图上的复选标记图标(附件视图)?

更改 ios7、Interface Builder 中的复选标记颜色

按下键盘上的复选标记键时,可使用 RecyclerView 进行过滤