我可以用@selector为UIButton传递一个数组参数吗?

时间:2012-03-30 12:36:54

标签: ios objective-c arguments action selector

我有一个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 IdentifierExpected ]

有可能吗?有没有办法做到这一点?

4 个答案:

答案 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