Тип аксессуара UITableViewCell, проверенный на доступ и установка других непроверенных

Я немного смущен о принадлежностях ячейки таблицы настроек.

Я зафиксировал два раздела в моей таблице

  • Главная
  • офис

То, что я хочу, так далее.

  • Когда пользователь нажимает любую ячейку
  • Ячейка выбирается &
    • Я хочу установить флажок (установить тип аксессуара uitableviewcell -checked из удаленной ячейки)
  • А также все аксессуары для аксессуаров другой ячейки теперь должны
    • подходящий вид сотовый аксессуар тип нет

Я пробовал следующий код. Но я обнаружил, что indexpath.row & indexpath.section – только свойства readonly.

// 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]; } 

Я бы отслеживал данные, которые необходимо проверить, и изменить ячейку в таблицеView: didSelectRowAtIndexPath: и обновить, какие данные отмечены в таблицеView: 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; } 

Объявите одну переменную int с именем prev и реализуем этот метод:

 -(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. в cellForRowAtIndexPath ..

 if ([selectedIndexPathForCheckMark isEqual:indexPath]) { [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; }else { //setAccessoryType None if not get the selected indexPath [cell setAccessoryType:UITableViewCellAccessoryNone]; } 

Вот как я делаю это со статическими ячейками и обходя cellForRow

Создайте var, в котором хранится местоположение ячейки «checked».

  NSInteger _checkedCell; 

Затем просто willDisplayCell методы 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]; } 

Я знаю, что этот вопрос довольно старый, но вот версия 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() } } } 

В Swift 2.0 с использованием пользовательского аксессуара uitableviewcell с быстрым

1º Создание Globar var IndexPath

 var indexSelected = NSIndexPath() 

2º В didSelectRowAtIndexPath

 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { indexSelected = indexPath TB_Lojas.reloadData() } 

3º в cellForRowAtIndexPath:

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

Учитывая, что вы хотите сохранить только один выбор, и если у вас есть пользовательский 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 не включен, он автоматически обрабатывает allowsMultipleSelection других ячеек при allowsMultipleSelection нового. Если allowMultipleSelection включен, то он также будет работать, за исключением того, что вам просто нужно нажать еще раз, чтобы отменить выбор.

Ответ BlackBerry в Swift 3. UITableView со стандартными ячейками, выбор 0 или 1 ячейки.

 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() } } 
  • Добавление неизвестного количества строк в «Статические ячейки» UITableView
  • UIButton внутри представления с UITapGestureRecognizer
  • Как вы можете читать файлы MIME-типа в объективе-c
  • фильтрация NSArray в новый NSArray в объективе-c
  • objective C: Как вы можете повернуть текст для UIButton и UILabel?
  • Как я могу программно проверить, присутствует ли клавиатура в приложении iOS?
  • Позиционирование MKMapView для одновременного отображения нескольких аннотаций
  • С ARC, что лучше: alloc или autorelease инициализаторы?
  • Эквивалент карты NSArray
  • Сколько стоит разработка приложения для iPhone?
  • Есть ли способ указать позицию / индекс аргумента в NSString stringWithFormat?
  • Давайте будем гением компьютера.