Тип аксессуара 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 без UITableViewController
  • Сравнение поплавковых и двойных типов данных в объекте C
  • Сортировка NSArray пользовательских объектов по их свойствам NSDate
  • Ошибка модуля сборки iOS8 для Facebook для FBSDKCoreKit
  • Интеграция CFNetwork и Bonjour для интеграции iPhone и Mac
  • используя objc_msgSend для вызова функции Objective C с именованными аргументами
  • Поиск NSArray для значения соответствия значений
  • Как вы можете читать файлы MIME-типа в объективе-c
  • Нарисуйте часть круга
  • как я могу использовать анимацию в cocos2d?
  • Interesting Posts

    Как изменить шрифт лица Webview в Android?

    Как я могу назвать таблицу автоматически, ссылаясь на две ячейки?

    Каковы варианты использования для возврата функции по значению const для нестрогового типа?

    Bitmap getWidth возвращает неверное значение

    Процедура карты Prolog, которая применяет предикат к элементам списка

    Строка Android Split

    Сложность времени подстроки Java ()

    Фантомный жесткий диск после развертывания последнего изображения Windows 7 из WDS

    Как отлаживать проекты библиотеки внешних classов в visual studio?

    Система, подключенная к ИБП, переходит в сон короткое время после потери питания

    Как извлечь имя файла из пути?

    как рассчитать сложность двоичного поиска

    Прослушивайте музыку телефона через динамики компьютера

    Когда использовать абстрактный class или интерфейс?

    Visual Studio: существует ли рефакторинг «переместить class в другое пространство имен»?

    Давайте будем гением компьютера.