Как выбрать метод, основанный на элементе NSArray (Objective-C) - PullRequest
0 голосов
/ 01 августа 2011

Я пишу приложение для калькулятора. У меня есть UIPickerView (1 столбец) загрузки данных из NSArray строк. Пользователь выберет один из них (он выбирает, какой тип калькулятора использовать - каждый использует свой метод расчета). Пользователь вводит некоторые вещи в некоторые поля UITextFields и затем нажимает кнопку UIB для выполнения вычислений.

Мой NSArray такой:

calcNames = [NSArray alloc] initWithObjects:@"first", @"second", @"third", nil];

И мои методы называются firstCalc (input1, input2, input3), secondCalc (input1, input2, input3) и так далее. (Входные данные поступают из полей UITextFields.)

Когда я нажимаю кнопку, я хотел бы сказать ей, чтобы посмотреть, что такое выделение в UIPickerView, и запустить соответствующий метод, не просто набирая оператор if-then для каждого (это очень неудобно делать по причинам характерные для моего приложения, которые выходят за рамки этого обсуждения).

Итак, я уже определил способ определения выбранного калька:

selectedCalc = [[NSString alloc] initWithString:[calcNames objectAtIndex:row]]

где 'row' - текущий выбор в UIPickerView.

Теперь у меня есть метод doCalculations, когда кто-то нажимает кнопку UIB:

-(IBAction)doCalculations:(id)sender  {

    // save the data input
    double input1 = [input1Field.text doubleValue];
    double input2 = [input2Field.text doubleValue];
    double input3 = [input3Field.text doubleValue];

    // do the calculations
    int i;
    for (i = 0; i < [calcNames count]; i++)  {
        if (selectedCalc == [calcNames objectAtIndex:i])  {
            // do calculations here
            double numResult = ??????
            // if selectedCalc is "first", I want it to do firstCalc(input 1, input 2, input 3)
            // if selectedCalc is "second", I want it to do secondCalc(input 1, input 2, input 3), and so on

            // the rest is just for displaying the result
            NSString* result = [NSString stringWithFormat:@"The answer is %f", numResult];
            [resultLabel setText:result];
        }
    }
}

Таким образом, в основном, он запускает цикл for, пока не найдет, какой калькулятор выбран из UIPickerView, и когда он его найдет, запустит вычисления и отобразит их.

Я пытался понять, могут ли указатели функций или селекторы (NSSelectorFromString?) Быть правильными вещами здесь и как их использовать, но я действительно изо всех сил пытаюсь понять, куда идти после пары дней чтения Документация Apple, вопросы переполнения стека, игра с образцом кода и работа с моим собственным кодом.

Извините, если вопрос слишком длинный, я подумал, что другим, кто ищет помощь в будущем, было бы более полезно увидеть полную идею. (По крайней мере, я знаю, что иногда я теряюсь с этими страницами вопросов.)

Буду очень признателен за любую помощь,

Райан

Ответы [ 3 ]

1 голос
/ 01 августа 2011

Вы можете динамически вызывать метод, используя селектор.Например, у вас может быть дополнительный массив к calcNames с селектором с именем calcSelectors:

SEL calcSelectors[] = (SEL[3]){ 
                               @selector(first:arg:), 
                               @selector(second:arg:), 
                               @selector(third:arg:)};

. Вызов правильного метода будет таким простым:

[self performSelector:calcSelectors[calcIndex] withObject:arg1 withObject:arg2];

Если вынужно более 2 аргументов, а затем вам нужно немного поэкспериментировать с экземпляром NSInvocation для установки вызова.

0 голосов
/ 01 августа 2011

Вы можете использовать NSInvocation для динамического связывания нескольких аргументов с селектором. Следуйте этому посту, чтобы узнать .

Если вы собираетесь использовать NSInvocation , вы должны определить свои методы в Objective-C следующим образом:

- (double)firstCalcWithInput1:(double)input1 input2:(double)input2 andInput3:(double)input3;
- (double)secondCalcWithInput1:(double)input1 input2:(double)input2 andInput3:(double)input3;
0 голосов
/ 01 августа 2011

Пример 1:

NSString *method=[calcNames objectAtIndex:0];//here play with objectatindex

SEL s=NSSelectorFromString(method);

[self performSelector:s];


which will call this method 

-(void)first{

    NSLog(@"first");
}



-----------------------------------------

Пример 2:

NSString *totalMethodName;

totalMethodName=@"vijay";

totalMethodName=[totalMethodName stringByAppendingString:@"With"];


totalMethodName=[totalMethodName stringByAppendingString:@"Apple"];


SEL s=NSSelectorFromString(totalMethodName);

[self performSelector:s];



will call 


-(void)vijayWithApple{

    NSLog(@"vijayWithApple called");
}
...