tableView

时间:2017-07-12 05:50:32

标签: ios objective-c uitableview

我有以下实现,用户可以根据需要选择任意数量的项目。

我可以在用户选择项目时看到复选标记,但是当用户向上或向下滚动时,会出现奇怪的行为,因为我看到其他项目也被选中,即使它未被选中。

例如,如果我按顺序选择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;
}

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

这个问题是因为你'检查了tableviewcell'而不是你的数据。 因此,如果您不记录此检查信息,则即使此单元实例已更改为显示不同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;
}