「オン」のチェックマークを「オフ」に変更するには、CellAccessoryType
のnone
とcheckmark
の間のdidSelectRowAtIndexPath
を変更する必要があると思います。 _?
私はこれをやったが、その振る舞いはiPhoneの自動ロック設定のチェックマークセルのようなものと完全に同一ではないことに気付いたからです。
または、チェックマークを処理する他の方法がありますか?
View ControllerにselectedRow
という名前のプロパティを保持します。このプロパティは、テーブルセクションのチェックされたアイテムを表す行のインデックスを表します。
View Controllerの-tableView:cellForRowAtIndexPath:
デリゲートメソッドで、セルのindexPath.row
がaccessoryType
値と等しい場合、cell
のUITableViewCellAccessoryCheckmark
をselectedRow
に設定します。それ以外の場合は、UITableViewCellAccessoryNone
に設定します。
View Controllerの-tableView:didSelectRowAtIndexPath:
デリゲートメソッドで、selectedRow
値を選択されているindexPath.row
に設定します。例:self.selectedRow = indexPath.row
別の解決策:
-(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;
}
そしてええ:oldIndex
がnil
であるかどうかを確認する必要はありません:)
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
}
Zyphraxは私にぴったりの素晴らしいソリューションを提案しました!前に選択した行をクリアする必要がある場合は、次を使用します。
[self.tableView reloadData];
に
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
アレックスの答えは、リロードテーブルを追加した後にのみ機能しました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];
迅速:
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)
}
そのはず
didHighlightRowAtIndexPath
の代わりに
tableView:didSelectRowAtIndexPath
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
}
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;
}