2011-08-01 9 views
0

私はある種の電卓アプリを書いています。私は文字列のNSArrayからデータをロードするUIPickerView(1列)を持っています。ユーザーは、これらのいずれかを選択します(使用する計算機のタイプを選択しています - それぞれ異なる方法を使用して計算します)。ユーザはいくつかのUITextFieldに何かを入力し、次にUIButtonを押して計算を行います。NSArrayの要素に基づいてメソッドを選択する方法(Objective-C)

マイNSArrayのがこれです:

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

そして、私の方法がそのようにfirstCalc(INPUT1、INPUT2、INPUT3)、secondCalc(INPUT1、INPUT2、INPUT3)と呼ばれる、とされています。 (入力はUITextFieldsから来ています)

私はボタンを押すと、UIPickerViewの選択内容を見て、対応するメソッドを実行するためにif-then文を入力するだけでそれぞれ(私のアプリに固有の理由でこれを行うのは非常に不便ですが、これはこの議論の範囲を超えています)。

は、だから私はすでに選択CALCが何であるかを決定するための方法を定義している:

「行」はUIPickerViewの現在の選択である

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

今、私は誰かが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]; 
     } 
    } 
} 

それはUIPickerViewから選択し、それを見つけたときに、実行される計算見つかるまで、だから、基本的に、それはループのために実行を計算して表示します。

ここでは、関数ポインタやセレクタ(NSSelectorFromString?)がここで使用する正しい使い方と使用方法を理解しようとしていましたが、数日後にどこに行くべきかを理解するのは本当に苦労しています。 Appleのドキュメントを読んで、Stack Overflowの質問をしたり、サンプルコードで遊んだり、自分のコードを試したりしていました。

申し訳ありません申し訳ありません申し訳ありませんが長すぎる場合、私はそれが将来的に完全なアイデアを見るために援助を探している他の人に役立つかもしれないと思った。 (少なくとも私は時々私はこれらの質問のページで失われています知っている。)

私はどのような援助のために非常に感謝される、

ライアン

答えて

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; 

[email protected]"vijay"; 

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


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


SEL s=NSSelectorFromString(totalMethodName); 

[self performSelector:s]; 



will call 


-(void)vijayWithApple{ 

    NSLog(@"vijayWithApple called"); 
} 
1

セレクタを使用してメソッドを動的に呼び出すことができます。あなたは、例えば、セレクタとcalcNamesへの二次配列はcalcSelectors呼ばれている可能性:

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

右のメソッドを呼び出すと、その後のように簡単になります:あなたはもっとして2つの引数が必要な場合は、その後、

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

また、電話を設定するためにNSInvocationインスタンスを少し混乱させる必要があります。

0

NSInvocationを使用すると、複数の引数をセレクタに動的にバインドできます。 Follow this post to learn it

NSInvocationを使用する場合は、以下のような目的でCの方法でメソッドを定義する必要があります。

- (double)firstCalcWithInput1:(double)input1 input2:(double)input2 andInput3:(double)input3; 
- (double)secondCalcWithInput1:(double)input1 input2:(double)input2 andInput3:(double)input3; 
関連する問題