如何选择基于NSArray元素的方法(Objective-C)

时间:2011-08-01 10:26:07

标签: objective-c ios methods nsstring nsarray

我正在写一种计算器应用程序。我有一个UIPickerView(1列)从NSArray字符串加载数据。用户将选择其中一个(它选择使用哪种类型的计算器 - 每个使用不同的方法来计算)。用户将一些内容输入到某些UITextField中,然后按下UIButton进行计算。

我的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中的当前选择。

现在,当有人按下UIButton时,我有一个doCalculations方法:

-(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的文档,Stack Overflow问题,使用示例代码,以及修改我自己的代码。

很抱歉,如果这个问题过于冗长,我认为将来寻求帮助的其他人可能会更有帮助。 (至少我知道有时我会丢失这些问题页面。)

我将非常感谢任何帮助,

赖安

3 个答案:

答案 0 :(得分:1)

您可以使用选择器动态调用方法。例如,您可以使用名为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实例来设置调用。

答案 1 :(得分:0)

示例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");
}

答案 2 :(得分:0)

您可以使用 NSInvocation 将多个参数动态绑定到选择器。 Follow this post to learn it

如果您要使用 NSInvocation ,您必须以Objective-C方式定义您的方法,如下所示。

- (double)firstCalcWithInput1:(double)input1 input2:(double)input2 andInput3:(double)input3;
- (double)secondCalcWithInput1:(double)input1 input2:(double)input2 andInput3:(double)input3;