Селекторы с аргументами в Obj-C - PullRequest
1 голос
/ 11 февраля 2010

Так что в основном у меня есть большой список кнопок с выпадающими списками и другими вещами, и эти кнопки создаются динамически. Поэтому, чтобы зафиксировать значение для данных соответствующей кнопки, мне нужно установить ее селектор действия на функцию, которая принимает 1 дополнительный параметр.

Например, использование этого селектора в этом раскрывающемся списке с помощью метода, приведенного ниже, возвращает ошибку о том, что селектор не распознан. Как заставить селектор распознавать передаваемый параметр? (В данном случае переменная name)

Apple документы в: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocSelectors.html#//apple_ref/doc/uid/TP30001163-CH23-SW1

В последнем абзаце в заголовке «Шаблон разработки целевого действия» в Apple Docs подразумевается , что это можно сделать, но не приводится пример использования настраиваемого сообщения или, может быть, я просто недоразумение?

SEL sel = @selector(openDropdown:name:);
[dropdownSelector addTarget:self action:sel forControlEvents:UIControlEventTouchUpInside];


-(void) openDropdown: (NSString *) anotherArg : (id) sender {
 // Stuff here based on anotherArg
}

Ответы [ 3 ]

3 голосов
/ 11 февраля 2010

Вы должны быть в состоянии получить информацию о нажатой кнопке из id input arg

    UIButton *button = (UIButton *) sender
     NSString *title = [button currentTitle];

Нет необходимости передавать дополнительный параметр

2 голосов
/ 11 февраля 2010

То, что вы просите, не может быть сделано. Из документов:

UIKit допускает три различных формы селектора действий:

- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)event

Поскольку вы не можете влиять на параметр события, объект sender должен содержать всю информацию, которую вы хотите передать методу действия.

Несмотря на то, что вы написали в своем комментарии к ответу mihirsm, вы действительно можете создать подкласс UIButton, чтобы добавить всю необходимую дополнительную информацию к каждому экземпляру кнопки. Вы также можете использовать свойство кнопки tag, чтобы идентифицировать ее (назначить уникальный тег каждой кнопке) и сохранить всю дополнительную информацию в массиве или словаре, используя теги в качестве ключей.

Обновление: В будущем вы также можете использовать ассоциативное хранилище для добавления данных к объектам без их подклассов, но эта технология (пока) недоступна на платформе iPhone (10.6 только на данный момент).

1 голос
/ 12 февраля 2010

CALayer s поддерживает произвольные ключи для кодирования значения ключа; Вы можете использовать это, чтобы прикрепить произвольные слои:

[[button1 layer] setValue:@"firstButtonData" forKey:@"myKey"];
[[button2 layer] setValue:@"secondButtonData" forKey:@"myKey"];

И позже:

- (void)action:(id)sender forEvent:(UIEvent *)event
{
    NSLog(@"Data for the button that was pressed: %@", [[sender layer] valueForKey:@"myKey"]);
}

Будьте осторожны, чтобы не столкнуться ни с одним из существующих свойств CALayer

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