这段代码有问题吗?我试图通过在运行时定义标签,回调选择器以及稍后指向UIButton本身的指针来设置一些按钮。但是使用这段代码,我得到了EXC_BAD_ACCESS。如果我用NSSelectorFromString删除该行,它就会消失。但由于这只是一个被添加到字典中的对象,我不明白害羞它失败了。
NSMutableDictionary *attachButtonDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:
@"Attach To Job",@"keyForLabel",
NSSelectorFromString(@"attachToJob"), @"keyForSelector",
nil];
答案 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];