Тип аксессуара 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() } } 
  • Опубликовать фотографию на стене пользователя, используя Facebook iOS SDK
  • Центральное содержимое UIScrollView при меньшем
  • Есть ли способ удалить разделительную линию из UITableView?
  • NSMutableArray addObject не работает
  • Как получить текущее название города?
  • Получение списка файлов в каталоге с глобусом
  • как удалить subviews из scrollview?
  • Программно включить Bluetooth в iphone sdk?
  • Эквивалент карты NSArray
  • Лучший способ удалить из NSMutableArray во время итерации?
  • Добавить анимированное изображение Gif в Iphone UIImageView
  • Interesting Posts

    Windows 7 VPN останавливает веб-браузер

    Ошибка в файле styles_base.xml – приложение для Android – Ресурс не найден, который соответствует указанному имени ‘android: Widget.Material.ActionButton’

    Как настроить сканирование файлов в приложении Spring Boot.exe

    Воспроизведение .mp3 и .wav в Java?

    Когда следует выбирать Vector в Scala?

    Как проверить, работает ли приложение на Android?

    Как правильно выполнять фоновый stream при использовании Spring Data и Hibernate?

    Огромные элементы управления Google Картами (Возможная ошибка?)

    Как перенести hdd установки Windows на новый компьютер?

    Тестирование stream.good () или! Stream.eof () дважды читает последнюю строку

    Google Maps: как получить страну, штат / провинцию / регион, город, учитывая значение lat / long?

    Как изменить курсор Notepad ++

    C ++ 11 эквивалентно увеличению shared_mutex

    Что означает .container. \ 31 25 \ 25 в CSS?

    Почему размер sizeof для структуры не равен сумме sizeof каждого члена?

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