绕过选择器然后指定参数

时间:2009-09-28 03:25:06

标签: iphone objective-c cocoa-touch

我有一个函数可以创建一个带有一堆UIButtons的UIView。

每个按钮调用一个带参数字符串的函数。

所以,在我的函数中,我做了类似的事情:

[button addTarget: [multiRadio objectAtIndex:0]
           action: NSSelectorFromString([multiRadio objectAtIndex:1])
 forControlEvents:UIControlEventTouchUpInside];     

但是,这段代码没有指定动作需要传递的字符串参数。

如果我在[multiRadio objectAtIndex:2]中有该字符串参数,如何设置按钮的操作以使用该字符串?

2 个答案:

答案 0 :(得分:1)

为什么不直接从您调用的方法访问它?而不是:

- ( void )someMethod:( id )sender withString:( NSString * )string {
    [ self doSomethingWithString:string ];
}

使用它:

- ( void )someMethod:( id )sender {
    SomeClass *multiRadio = [[ SomeClass alloc ] init ];
    [ self doSomethingWithString:[ multiRadio objectAtIndex:2 ]];
    ...
    [ multiRadio release ];
}

显然,根据需要更改方法签名,但这是绕过它的一种方法。

答案 1 :(得分:0)

我创建了一个对象类来充当这些事件的接收者。像这样:

ActionWrangler *wrangler = [[ActionWrangler alloc] init];
wrangler.target = [multiRadio objectAtIndex:0];
wrangler.selector = NSSelectorFromString([multiRadio objectAtIndex:1]);
wrangler.argument = [multiRadio objectAtIndex:2];
[button addTarget:wrangler
           action:@selector(wrangle)
 forControlEvents:UIControlEventTouchUpInside];

然后ActionWranger会有一个像这样的争吵方法:

- (void)wrangle
{
    [target performSelector:selector withObject:argument];
}

然后,您最大的问题是跟踪ActionWrangler实例,以便您可以释放它们。