1
  1. 以下のコードは、選択したセルを強調表示して横にチェックマークを付けたいときに機能します。

  2. 最後のセルまたはハイライトの選択を解除し、新しく選択したセルの横にチェックマークを付けてハイライトするので、別のセルを選択したいときにも機能します。

  3. また、選択したセルを選択解除してチェックマークを付けずにUITableで強調表示するときに、選択したセルを再選択したときにも機能します。

  4. ただし、同じセルを 3 回目に選択すると (つまり、最初に選択すると、コードによって強調表示され、次にチェックマークが付けられます。同じセルを 2 回目に選択すると、強調表示とチェックマークが削除され、同じセルを選択するのは今で 3 回目です) セルが一瞬ハイライトされ、ハイライトが消えます。セルの横にあるチェックマークも、選択を解除したばかりのように表示されません。同じセルを何度選択しても、強調表示されたり、横にチェック マークが付けられたりしません。これを行う唯一の方法は、最初に別のセルを選択してから、元のセルを再度選択することです。助けてください。

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
    {
    
        // select new
    
        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        [cell setSelected:TRUE animated:TRUE];
    
        // deselect old
        UITableViewCell *old = [self.tableView cellForRowAtIndexPath:self.lastSelected];
    
        old.accessoryType = UITableViewCellAccessoryNone;
        [old setSelected:FALSE animated:TRUE];
    
    
        // keep track of the last selected cell      
        self.lastSelected = indexPath;
    
    }
    

Storyboard を介して UITableView を構築しました。

4

1 に答える 1

1

そこのロジックを少し調整します。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{

    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

    if (self.lastSelected && (self.lastSelected.row == indexPath.row)) {
        cell.accessoryType = UITableViewCellAccessoryNone;
        [cell setSelected:NO animated:TRUE];
        self.lastSelected = nil;
    } else {
       cell.accessoryType = UITableViewCellAccessoryCheckmark;
       [cell setSelected:TRUE animated:TRUE];

        UITableViewCell *old = [self.tableView cellForRowAtIndexPath:self.lastSelected];
        old.accessoryType = UITableViewCellAccessoryNone;
        [old setSelected:NO animated:TRUE];
        self.lastSelected = indexPath;
    }
}
于 2013-01-18T07:11:05.463 に答える