UISwitch в ячейке таблицы определяет выбранный indexPath

Я использую UISwitch в accessoryView UITableViewCell.

Коммутатор использует target-action для связи, когда он выбран или не выбран:

switchV.addTarget(self, action: "onChangeSwitch:", forControlEvents: UIControlEvents.ValueChanged)

Проблема состоит в том, чтобы выяснить, какой переключатель был выбран. Я знаю 3 метода. Каждый в чем-то неудовлетворителен.

1. Я могу использовать теги:

switchV.tag = indexPath.row

Но это отстой, если у вас есть разделы (а у меня есть), потому что мне нужно проанализировать его в формате раздела / строки с двумя числами и из него.

2. Я мог бы использовать модель данных и сохранить представление переключателя для элемента данных, который рисует ячейка:

dataItem.switch.addTarget(self, action: "onChangeSwitch:", forControlEvents: UIControlEvents.ValueChanged)
cell.accessoryView = dataItem.switch

Затем я могу определить, какой переключатель был выбран, перебирая мой набор данных и выполняя идентификацию отправителя. Это много циклов, и я не хочу помещать представления в свою модель данных.

3. Еще есть этот метод, который использует координату переключателя для поиска строки. Без сохранения состояния, не требует синтаксического анализа строк или путаницы в модели данных, но координаты, правда? Могу ли я этому доверять?

tableView.indexPathForRowAtPoint(
  sender.convertPoint(CGPointZero, toView: tableView)
)

Есть ли лучший способ получить indexPath выбранного UISwitch?


person SimplGy    schedule 27.08.2015    source источник


Ответы (2)


На мой взгляд, метод №3 довольно хорош. Однако, если вы хотите, чтобы он был действительно чистым, вот что я сделаю.

  • Объявите настраиваемый TableviewCell, скажем CustomTableViewCell, и получите протокол делегата CustomCellDelegate. Здесь делегат информируется так:

     -(void)switchChanged:(UISwitch*)switch inCell:(CustomTableViewCell*)cell
    
  • В cellForRowAtIndexPath установите контроллер представления в качестве делегата ячейки.

  • Добавьте переключатель в свою настраиваемую ячейку и сделайте ячейку целевой и реализуйте метод действия переключателя. Внутри метода действия вызовите делегата:

    -(void)switchChanged:(id)sender {
        if(self.delegate && [self.delegate respondsToSelector:@selector(switchChanged:inCell:])) {
            [self.delegate switchChanged:sender inCell:self];
    }
    
  • Теперь в вашем viewController используйте переданную ячейку в методе делегата для вычисления пути индекса:

     -(void)switchChanged:(id)sender inCell:(CustomTableViewCell*)cell {
        NSIndexPath *path = [self.tableview indexPathForCell:cell];
     }
    

Это немного работы, но если вы хотите сделать это должным образом, вы можете.

person Samhan Salahuddin    schedule 27.08.2015

Другой вариант - использовать хэш, который поддерживает переключение -> канал передачи данных.

var switchToData=[UISwitch:yourData]()

в cellForRowAtIndexPath:

switchToData[newSwitch]=myData

в onChangeSwitch

dataChanged=switchToData[switchChanged]

Хеш будет совсем маленьким, такого же размера видимого переключателя ....

person tomsoft    schedule 27.08.2015