我正在写一种计算器应用程序。我有一个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问题,使用示例代码,以及修改我自己的代码。
很抱歉,如果这个问题过于冗长,我认为将来寻求帮助的其他人可能会更有帮助。 (至少我知道有时我会丢失这些问题页面。)
我将非常感谢任何帮助,
赖安
答案 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;