Получение NSIndexPath строки для UISwitch

У меня есть табличное представление с пользовательскими UITableViewCells, каждая строка в таблице имеет индикатор UILabel, UISwitch и раскрытия деталей.

Я ищу лучший метод захвата UIControlEventChanged для коммутатора, но мне также нужен NSIndexPath коммутатора, который изменился для обновления основных данных.

Я также не хочу использовать UISwitch в качестве аксессуара.

Я гуглил это часами, и решение, которое продолжает появляться, - это использовать

[switch addTarget:self action:@selector(switchTapped:) forControlEvents:UIControlEventChanged];

затем в методе switchTapped: используйте следующее, чтобы получить NSIndexPath

NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)[[sender superview] superview]];

Есть ли лучший способ сделать это? У меня уже есть подкласс UITableViewCell, могу ли я поместить в этот класс метод для возврата NSIndexPath для данного переключателя?

Заранее благодарю за любую помощь


person Matt Price    schedule 19.03.2012    source источник
comment
Но если иерархия представлений будет изменена в какой-либо момент, например, при обновлении iOS, это не удастся.   -  person Matt Price    schedule 19.03.2012
comment
Хорошо, вы можете подойти и найти первое суперпредставление типа UITableViewCell. Это, скорее всего, потерпит неудачу.   -  person wbyoung    schedule 19.03.2012
comment
Возможно, я не совсем понимаю ваш вопрос... У вас есть UISwitch в вашей пользовательской UITableViewCell, и UITableViewCell обрабатывает изменение переключателя. Это то, что вы говорите? Разве вы не можете создать протокол и установить, что ваш tableViewController должен быть делегатом для этой ячейки? Можете ли вы опубликовать дополнительный код, чтобы проиллюстрировать вашу проблему немного больше?   -  person Nick Bull    schedule 19.03.2012
comment
@NickBull У меня это работает, используя приведенный выше код. В cellForRowAtIndexPath: у меня есть [переключатель addTarget: self action: @selector(switchTapped:) forControlEvents:UIControlEventChanged]; Затем в switchTapped: у меня есть приведенный выше код NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)[[sender superview] superview]]; чтобы получить UITableViewCell, который позволяет мне получить NSIndexPath для этой ячейки. Но мне не нравится вложенный подход superview для поиска UITableViewCell, и я искал лучший метод   -  person Matt Price    schedule 19.03.2012
comment
Так это все в одном классе? Это то, к чему я клоню. Из того, что вы написали, похоже, что вы вкладываете слишком много знаний в один класс. Вам нужно разделить его. Тогда вы можете получить доступ к информации намного проще, не полагаясь на иерархию представлений, которая просто напрашивается на неприятности.   -  person Nick Bull    schedule 19.03.2012


Ответы (2)


Я воспользуюсь еще одной возможностью, чтобы сослаться на мой ответ здесь - теги и обход иерархии представлений неуклюжи, подвержены ошибкам и не нужны, и я вижу, что их рекомендуют повсюду в ответах SO. Вы можете найти индексный путь любого элемента управления, используя его фрейм и метод табличного представления indexPathForRowAtPoint:.

person jrturton    schedule 19.03.2012
comment
спасибо за ваш ответ, это кажется лучшим подходом. - person Matt Price; 19.03.2012

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

Таким образом вы избегаете возможных проблем, которые могут возникнуть при изменении иерархии представлений.

Этот пост также может вам помочь.

person Bourne    schedule 19.03.2012
comment
Поначалу это звучит как хорошее решение, но становится плохо, когда вы начинаете удалять и переставлять строки. - person KoCMoHaBTa; 05.03.2019