Динамически объявить имя функции? - PullRequest
0 голосов
/ 22 сентября 2010

Я создаю список кнопок панели с его функциями действий (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 ]

4 голосов
/ 22 сентября 2010

Я не вижу преимущества динамического создания объявления метода, так как код в этих методах также не будет динамическим.

Таким образом, вы должны объявить отдельный метод, который будет вызываться каждой кнопкой, которому вы передаете тег или ссылку на отправителя (кнопку) или какое-либо другое значение, которое позволяет вашему методу определить, какая кнопка была нажата ранее. к вызываемому методу. Вы могли бы сделать что-то вроде этого:

-(void)buttonPressed: (int)tag {

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

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

   // prepare code for further buttons...

}
0 голосов
/ 23 сентября 2010

Вы действительно не должны этого делать, это плохая практика кодирования, и я обещаю вам, что в какой-то момент разработки вы пожалеете об этом. С другой стороны, то, что вы МОЖЕТЕ сделать, - это обрабатывать вещи с блоками (например, функции, которые вы объявляете встроенными и в стеке).

Вы бы объявили блок встроенным что-то вроде этого:

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

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

Что вы можете сделать, это сделать подкласс для вашей кнопки, который выполняет заданный оператор блока при нажатии.

Подробнее о блоках: developer.apple.com

...