我有一个UIButton
,我想在其中添加一个存储在NSArray
中的目标操作。
我想要类似的东西,
- (IBAction) myAction
{
//Do Something
}
//Add myAction to myArray
[myArray addObject:myAction];
//Add target on myButton
[myButton addTarget:self action:@selector([myArray objectAtIndex:0]) forControlEvents:UIControlEventTouchUpInside];
我正在尝试,但它显示错误消息,例如Expected Identifier
和Expected ]
有可能吗?有没有办法做到这一点?
答案 0 :(得分:8)
如果myArray
是您要用作选择器的NSStrings
数组,那么您可以使用NSSelectorFromString
:
[myButton addTarget:self action:NSSelectorFromString([myArray objectAtIndex:0]) forControlEvents:UIControlEventTouchUpInside];
或者,如果要在NSArray
中存储选择器,则必须将它们包装在NSValue
中,因为SEL
不是Objective-C对象:
NSValue* selCommandA = [NSValue valueWithPointer:@selector(handleCommandA:)];
NSValue* selCommandB = [NSValue valueWithPointer:@selector(handleCommandB:)];
NSArray *handlers = [NSArray arrayWithObjects:selCommandA, selCommandB, nil ];
SEL mySelector = [[handlers objectAtIndex:0] pointerValue];
[myButton addTarget:self action:mySelector forControlEvents:UIControlEventTouchUpInside];
答案 1 :(得分:4)
您可以将选择器名称存储为字符串,然后根据这些名称创建选择器。例如:
myArray = [NSArray arrayWithObjects:@"method1", @"method2", nil];
[myButton addTarget:self action:NSSelectorFromString([myArray objectAtIndex:0]) forControlEvents:UIControlEventTouchUpInside];
答案 2 :(得分:1)
您可以尝试将选择器放入数组中。
SEL
是一个结构,因此您需要将其转换为NSValue
以将其存储在数组中
[myArray addObject:[NSValue valueWithBytes:&@selector(myAction) withObjCType:@encode(Selector)]];
然后你可以从数组中取出NSValue
,将值转换为SEL
,并将其用作动作。
SEL selector;
[[myArray objectAtIndex:0] getValue:&selector];
[myButton addTarget:self action:selector forControlEvents:UIControlEventTouchUpInside];
答案 3 :(得分:0)
选择器是对象或类中方法的名称(例如“doSomething:
”),并且不能是对象本身。
如果要传递数组,请将该方法作为myArray
接口文件或.h
中定义的实例变量获取@property
。