2010-09-12 2 views
2

@selector (updateStuff :)UIControl (addTarget: действие: forControlEvents :) аргументы @selector

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

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

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

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

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

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

+0

Ответ на этот вопрос был вариант № 2, который делает № 1 ненужным. – Zak

ответ

4

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

+0

Поскольку на объект есть только один тег, я не вижу, как это будет отличаться от использования указателя. Моя проблема заключается в том, что один коммутатор будет перерабатываться для двух разных индикаторов. Вот почему мне нужно было бы переопределить @selector – Zak

+1

Трюк устанавливает только те данные, которые необходимы для тега, и не воссоздает UISwitch, который является дорогостоящей операцией по действию dequeue, поэтому вы получаете улучшение производительности, имея уникальный UISwitch –

+0

Можете ли вы расширить это? Можете ли вы рассказать мне, как я могу связать (повторно используемый переключатель - и, следовательно, тег) с массивом индикаторов? Он не нажимает на меня. – Zak

1

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

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

Опять же, я не вижу, как это будет отличаться от использования указателя. Моя проблема заключается в том, что один коммутатор будет перерабатываться для двух разных индикаторов. Добавление свойств не помогло бы, теги не помогут. Я понятия не имею, что objc_setAssociatedObject()), или где можно получить информацию об этом. Я не думаю, что вы полностью прочитали мой вопрос. Если я добавлю аксессуар после и использую уникальный переключатель для каждого индикатора, он отлично работает, но это очень медленно. Вот почему мне нужно было бы переопределить @selector – Zak

+0

Я не думаю, что вы полностью прочитали мой ответ. –

0

Я написал подкласс 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

Смежные вопросы