UIControl (addTarget: action: forControlEvents :) @selector arguments - PullRequest
2 голосов
/ 13 сентября 2010

@ селектор (updateStuff:)

Это автоматически отправляет параметр: (id) отправитель.Можно ли переопределить это, чтобы быть чем-то другим?В моем конкретном случае фактический отправитель не имеет смысла.

Я использую UITableView и устанавливаю UISwitch в слот UIAccessoryView в каждой ячейке.Первоначально я добавлял UISwitch в UIAccessoryView вне инициализации ячейки, что позволяло каждому UISwitch быть уникальным экземпляром.Однако это создает заметную задержку при прокрутке длинного списка на iPhone 3G.Если я добавлю UIAccessoryView в ячейку при ее инициализации, его можно будет удалить из очереди вместо создания экземпляра, что значительно облегчит отставание.К сожалению, стоимость этого заключается в том, что экземпляр НЕ уникален для каждого переключателя UIS в таблице, и: (id) отправитель теряет смысл.

Мне нужна одна из двух вещей ...

  1. Способ переопределения параметра, связанного с @selector, поэтому я могу заменить: (id) sender
  2. Или лучшую стратегию, чем та, которую я использую для отслеживания переключателей UIS.

Я всегда могу прибегнуть к добавлению UIS-переключателя после того, как ячейка создана / удалена, но она ужасно медленная и неэффективная.Спасибо за любую помощь.

С уважением, Z @ K!

Ответы [ 3 ]

4 голосов
/ 13 сентября 2010

У меня была похожая проблема, я решил ее, задав свойство тега отправителя, каждое представление имеет это свойство, и его цель - помочь идентифицировать его. Поэтому при создании / снятии очереди с ячейки установите тег для идентификации ячейки, а в действии используйте [тег отправителя], чтобы получить контекст клика

1 голос
/ 13 сентября 2010

Много, много способов:

  • Установить тег.
  • Установить «связанный объект» (см. Objc_setAssociatedObject ())
  • Подкласс UISwitch.Добавьте некоторые свойства.
  • Подкласс UITableViewCell.Добавьте некоторые свойства.Перемещайтесь вверх по иерархии представлений, пока не достигнете ячейки табличного представления (что-то вроде while (v && ![v isKindOfClass:[UITableViewCell class]]) {v = v.superview; }).
  • Перейдите вверх по иерархии представлений, как указано выше.Вызовите [tableView indexPathForCell:(UITableViewCell*)v].
  • Если имеется несколько табличных представлений, вы можете продолжать навигацию вверх, пока не нажмете UITableView ...
0 голосов
/ 26 октября 2012

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

https://gist.github.com/3958325

Вы можете использовать его так:

ZUISwitch *mySwitch = [ZUISwitch alloc] init];

[mySwitch onValueChange:^(UISwitch *uiSwitch) {
        if (uiSwitch.on) {
            // do something
        } else {
            // do something else
        }
    }];

Вы также можете использовать его из файла XIB, перетащив переключатель на свой вид, а затем изменив его класс на ZUISwitch

...