設定テーブルビューのセルアクセサリについて少し混乱しています。
テーブルの2つのセクションを修正しました
私が欲しいのは以下の通りです...
次のコードを試しました。しかし、indexpath.rowとindexpath.sectionは読み取り専用プロパティであることがわかりました。
// Override to support row selection in the table view.
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tblProfileView deselectRowAtIndexPath:indexPath animated:YES];
int i,max;
UITableViewCell *x; NSIndexPath *tt;
for(i=0;i<[tblProfileView numberOfRowsInSection:0];i++)
{
tt.row=i; tt.section=0;
x=[tblProfileView cellForRowAtIndexPath:];
[x setAccessoryType:UITableViewCellAccessoryNone];
}
for(i=0;i<[tblProfileView numberOfRowsInSection:1];i++)
{
tt.row=i; tt.section=1;
x=[tblProfileView cellForRowAtIndexPath:tt];
[x setAccessoryType:UITableViewCellAccessoryNone];
}
x=[tblProfileView cellForRowAtIndexPath:indexPath];
[x setAccessoryType:UITableViewCellAccessoryCheckmark];
// Navigation logic may go here -- for example, create and Push another view controller.
// AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil];
// [self.navigationController pushViewController:anotherViewController animated:YES];
// [anotherViewController release];
}
dataを追跡し、tableView:didSelectRowAtIndexPath:のセルを変更し、tableView:cellForRowAtIndexPath:でチェックするデータを次のように更新します。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// do usual stuff here including getting the cell
// determine the data from the IndexPath.row
if (data == self.checkedData)
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// determine the selected data from the IndexPath.row
if (data != self.checkedData) {
self.checkedData = data;
}
[tableView reloadData];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];
if (newCell.accessoryType == UITableViewCellAccessoryNone) {
newCell.accessoryType = UITableViewCellAccessoryCheckmark;
}else {
newCell.accessoryType = UITableViewCellAccessoryNone;
}
}
また、cellForRowAtIndexPathのチェックマークアクセサリーを削除する必要があります
if ([selectedOptionsArray indexOfObject:cell.textLabel.text] != NSNotFound) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}else{
cell.accessoryType = UITableViewCellAccessoryNone;
}
prev
という名前の1つのint変数を宣言し、このメソッドを実装します。
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell =[tableView cellForRowAtIndexPath:indexPath];
if (cell.accessoryType==UITableViewCellAccessoryNone)
{
cell.accessoryType=UITableViewCellAccessoryCheckmark;
if (prev!=indexPath.row) {
cell=[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:prev inSection:0]];
cell.accessoryType=UITableViewCellAccessoryNone;
prev=indexPath.row;
}
}
else{
cell.accessoryType=UITableViewCellAccessoryNone;
}
}
選択した行にのみチェックマークのロジックを実装する最短かつ最も簡単な方法.....
1 .NSIndexPathのグローバルオブジェクトを作成します..
selectedIndexPathForCheckMark= [[NSIndexPath alloc] init];
2 .didSelectRowAtIndexPath ..
//選択したindexPathを宣言されたオブジェクトに関連付けます
selectedIndexPathForCheckMark = indexPath;
[tableView reloadData];
3 .in cellForRowAtIndexPath ..
if ([selectedIndexPathForCheckMark isEqual:indexPath]) {
[cell setAccessoryType:UITableViewCellAccessoryCheckmark];
}else {
//setAccessoryType None if not get the selected indexPath
[cell setAccessoryType:UITableViewCellAccessoryNone];
}
私はこの質問はかなり古いことを知っていましたが、ここにSwift Blackberryの応答に基づくバージョンがあります(ちなみに投票しました)
import UIKit
class PlacesViewController: UITableViewController, UITableViewDelegate, UITableViewDataSource {
var placesArray = NSMutableArray()
var previousCheckedIndex = 0
override func viewDidLoad() {
super.viewDidLoad()
self.placesArray.addObject("Tandil")
self.placesArray.addObject("Balcarce")
self.placesArray.addObject("Mar del Plata")
self.tableView.rowHeight = UITableViewAutomaticDimension
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.placesArray.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell: UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell
cell.textLabel?.text = self.placesArray.objectAtIndex(indexPath.row) as? String
return cell
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if (indexPath.row != previousCheckedIndex) {
var cell: UITableViewCell = self.tableView.cellForRowAtIndexPath(indexPath)!
if (cell.accessoryType == UITableViewCellAccessoryType.None) {
cell.accessoryType = UITableViewCellAccessoryType.Checkmark
if (previousCheckedIndex != indexPath.row) {
cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: previousCheckedIndex, inSection: 0))!
cell.accessoryType = UITableViewCellAccessoryType.None
previousCheckedIndex = indexPath.row
}
} else {
cell.accessoryType = UITableViewCellAccessoryType.None
}
tableView.reloadData()
}
}
}
静的セルを使用して、cellForRow
をバイパスする方法
「チェック済み」セルの場所を格納する変数を作成します。
NSInteger _checkedCell;
次に、このようなwillDisplayCell
およびdidSelectRow
メソッドを実装します。
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if (_checkedCell == indexPath.row) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
_checkedCell = indexPath.row;
[self.tableView reloadData];
}
In Swift 2.0 SwiftでカスタムaccessoryView uitableviewcellを使用
1ºGlovar var IndexPathの作成
var indexSelected = NSIndexPath()
2ºIn didSelectRowAtIndexPath
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
indexSelected = indexPath
TB_Lojas.reloadData()
}
cellForRowAtIndexPathの3º:
if SelectedIndexPath == indexPath {
let img = UIImageView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
img.image = UIImage(named: "check")
cell.accessoryView = img
}else{
let img = UIImageView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
img.image = UIImage(named: "uncheck")
cell.accessoryView = img
}
}
BlackBerryの回答Swift 3. 0または1セルを選択して、標準セルを含むUITableView。
private var previousSelection = NSIndexPath()
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let cell = tableView.cellForRow(at: indexPath)!
if cell.accessoryType == .none {
cell.accessoryType = .checkmark
selection = indexPath
if previousSelection == IndexPath() {
previousSelection = indexPath
} else if previousSelection != indexPath {
let previousCell = tableView.cellForRow(at: previousSelection)
previousCell?.accessoryType = .none
previousSelection = indexPath
}
} else if cell.accessoryType == .checkmark {
cell.accessoryType = .none
selection = IndexPath()
}
}
単一の選択のみを維持することを考慮し、カスタムUITableViewCell
がある場合は、以下をお勧めします。
あなたのUITableViewController
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
//...
let data = dataArray[indexPath.row]
if data.isSelected {
tableView.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: .None)
}
//...
return cell
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let data = dataArray[indexPath.row]
data.isSelected = true
let cell = tableView.cellForRowAtIndexPath(indexPath)
cell?.setSelected(true, animated: true)
}
override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
let data = dataArray[indexPath.row]
data.isSelected = false
let cell = tableView.cellForRowAtIndexPath(indexPath)
cell?.setSelected(false, animated: true)
}
カスタムUITableViewCell
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
self.accessoryType = .None
if selected {
self.accessoryType = .Checkmark
}
}
allowsMultipleSelection
が有効になっていない限り、新しいセルが選択されたときに他のセルの選択解除を自動的に処理します。 allowMultipleSelection
が有効になっている場合、選択を解除するにはもう一度タップするだけでよいことを除いて、同様に機能します。