NSSelectorFromString

时间:2011-05-01 21:37:36

标签: objective-c selector

这段代码有问题吗?我试图通过在运行时定义标签,回调选择器以及稍后指向UIButton本身的指针来设置一些按钮。但是使用这段代码,我得到了EXC_BAD_ACCESS。如果我用NSSelectorFromString删除该行,它就会消失。但由于这只是一个被添加到字典中的对象,我不明白害羞它失败了。

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

3 个答案:

答案 0 :(得分:4)

您无法将selector存储到NSDictionary

只需存储字符串,然后在构建按钮时NSSelectorFromString()

最佳, 基督教

编辑:

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 :(得分:4)

选择器不是objc对象;选择器是方法名称的不透明表示。

程序在将其添加到字典时会崩溃,因为它无法发送消息。例如,添加时无法保留。

答案 2 :(得分:1)

虽然您无法将选择器存储在字典中,但可以将其包装在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];