NSSelectorFromString - PullRequest
       4

NSSelectorFromString

3 голосов
/ 02 мая 2011

Что-то не так с этим кодом?Я пытаюсь настроить некоторые кнопки, определяя во время выполнения метку, селектор обратного вызова и, позже, указатель на сам UIButton.Но с этим кодом я получаю EXC_BAD_ACCESS.Это уходит, если я удаляю строку с NSSelectorFromString.Но так как это всего лишь объект, добавляемый в словарь, я не понимаю, застенчивый, что он терпит неудачу.

NSMutableDictionary *attachButtonDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                        @"Attach To Job",@"keyForLabel",
                                        NSSelectorFromString(@"attachToJob"), @"keyForSelector",
                                        nil];

Ответы [ 3 ]

4 голосов
/ 02 мая 2011

селектор не является объектом objc;Селектор является непрозрачным представлением имени метода.

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

4 голосов
/ 02 мая 2011

Вы не можете сохранить selector в своем NSDictionary.

Просто сохраните строку, и когда вы строите свою кнопку, вызовите NSSelectorFromString().

Best, Christian

Редактировать:

NSMutableDictionary *attachButtonDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                                @"Attach To Job",@"keyForLabel",
                                                @"attachToJob", @"keyForSelector",
                                                nil];

UIButton *fancyButton = [[UIButton alloc] init];
[fancyButton addTarget:self action:NSSelectorFromString([attachButtonDictionary objectForKey:@"keyForSelector"]) forControlEvents:UIControlEventTouchUpInside];
1 голос
/ 23 ноября 2011

Хотя вы не можете сохранить селектор в словаре, вы можете обернуть его в NSValue.

SEL fooSel = @selector(foo);
NSValue *selWrapper = [NSValue valueWithPointer:fooSel];
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObject:selWrapper 
                                                               forKey:@"foo"];
SEL myFooSel = [[dict objectForKey:@"foo"] pointerValue];
[obj performSelector:myFooSel];
...