动态声明函数名称?

时间:2010-09-22 10:32:25

标签: iphone cocoa cocoa-touch function selector

我正在创建一个条形按钮列表及其动作功能(sFuncName如下),它会动态更改。

当用户点击某个按钮时,系统会调用sFuncName

for(int i = 0; i < 3 ; i++){

        NSString* sFuncName = [NSString stringWithFormat:@"OnFunc_%d:", i ];
        barButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:systemItem target:self 
                     action:NSSelectorFromString(sFuncName)];
}

问题是:我有没有办法动态声明sFuncName以响应按钮?

示例:

for(int i = 0; i < 3 ; i++){

        NSString* sFuncName = [NSString stringWithFormat:@"OnFunc_%d:", i ];
        - (void)sFuncName: (id)sender; //sFuncName: OnFunc_0, OnFunc_1, OnFunc_2 
}

2 个答案:

答案 0 :(得分:4)

我没有看到动态创建方法声明的优势,因为这些方法中的代码也不是动态的。

因此,您应该声明一个方法,该方法将被每个按钮调用,您将标记或引用传递给发送者(按钮)或其他一些值,使您的方法可以告诉您之前已点击了哪个按钮被调用的方法。你可以这样做:

-(void)buttonPressed: (int)tag {

   if (tag == 0) {
      // Code for first button
   }

   if (tag == 1) {
      // Code for second button
   }

   // prepare code for further buttons...

}

答案 1 :(得分:0)

你真的不应该这样做,这是糟糕的编码实践,我保证你在开发的某个阶段你会后悔的。另一方面,你可以做的是用块处理东西(比如你在内联和堆栈中声明的函数)。

你会声明一个类似的内联块:

void (^doStuff)(int, char *) = ^(int arg0, char *arg1) {
   printf("hello block");
};

doStuff(1, "a");
doStuff(2, "b");
...

您可以做的是创建按钮的子类,以便在单击时执行给定的块语句。

有关区块的更多信息:developer.apple.com