web-dev-qa-db-ja.com

選択時のUITableViewCellチェックマークの変更

「オン」のチェックマークを「オフ」に変更するには、CellAccessoryTypenonecheckmarkの間のdidSelectRowAtIndexPathを変更する必要があると思います。 _?

私はこれをやったが、その振る舞いはiPhoneの自動ロック設定のチェックマークセルのようなものと完全に同一ではないことに気付いたからです。

または、チェックマークを処理する他の方法がありますか?

47
Jonathan.
  1. View ControllerにselectedRowという名前のプロパティを保持します。このプロパティは、テーブルセクションのチェックされたアイテムを表す行のインデックスを表します。

  2. View Controllerの-tableView:cellForRowAtIndexPath:デリゲートメソッドで、セルのindexPath.rowaccessoryType値と等しい場合、cellUITableViewCellAccessoryCheckmarkselectedRowに設定します。それ以外の場合は、UITableViewCellAccessoryNoneに設定します。

  3. View Controllerの-tableView:didSelectRowAtIndexPath:デリゲートメソッドで、selectedRow値を選択されているindexPath.rowに設定します。例:self.selectedRow = indexPath.row

76
Alex Reynolds

別の解決策:

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSIndexPath *oldIndex = [self.tableView indexPathForSelectedRow];
    [self.tableView cellForRowAtIndexPath:oldIndex].accessoryType = UITableViewCellAccessoryNone;
    [self.tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
    return indexPath;
}

そしてええ:oldIndexnilであるかどうかを確認する必要はありません:)


Swift 3以降:

override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    if let oldIndex = tableView.indexPathForSelectedRow {
        tableView.cellForRow(at: oldIndex)?.accessoryType = .none
    }
    tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark

    return indexPath
}
58
Zyphrax

Zyphraxは私にぴったりの素晴らしいソリューションを提案しました!前に選択した行をクリアする必要がある場合は、次を使用します。

[self.tableView reloadData]; 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
4
Winston

アレックスの答えは、リロードテーブルを追加した後にのみ機能しましたin .h

{
  int selectedCell;
}
@property(nonatomic,readwrite)int selectedCell;

in .m *cellForRowAtIndexPath*

if(indexPath.row == selectedCell)
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        cell.selected = YES;
    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.selected = NO;
    }

およびdidHighlightRowAtIndexPathまたはdidSelectRowAtIndexPathのどこでも

 self.selectedCell = indexPath.row;
    [self.tableView reloadData]; 
3
iMeMyself

迅速:

var selectedCell:UITableViewCell?{
    willSet{
        selectedCell?.accessoryType = .None
        newValue?.accessoryType = .Checkmark
    }
}

その後:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    selectedCell = self.tableView.cellForRowAtIndexPath(indexPath)
    self.mapView.selectAnnotation(self.mapView.annotations[indexPath.row], animated: true)
}
3
Ben

そのはず

didHighlightRowAtIndexPath

の代わりに

tableView:didSelectRowAtIndexPath

3
Abid Malik

Swiftの場合

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
  }

  func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        tableView.cellForRow(at: indexPath)?.accessoryType = .none
  }
0
BatyrCan

accessoryTypeとしてカスタムイメージを使用する場合は、以下のコードを使用

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UIImageView *imgCheckMark = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"select_icon.png"]];
    [imgCheckMark setFrame:CGRectMake(self.view.frame.size.width - 30, 25, 14, 18)];
    imgCheckMark.tag = 1000+indexPath.row;

    NSIndexPath *oldIndex = [self.tblSelectService indexPathForSelectedRow];
    [self.tblSelectService cellForRowAtIndexPath:oldIndex].accessoryView = UITableViewCellAccessoryNone;
    [self.tblSelectService cellForRowAtIndexPath:indexPath].accessoryView = imgCheckMark;
    return indexPath;
}
0
Hardik Thakkar