2011-08-01 62 views
0

我正在寫一種計算器應用程序。我有一個UIPickerView(1列)從NSArray的字符串中加載數據。用戶將選擇其中的一個(它選擇使用哪種類型的計算器 - 每個都使用不同的方法來計算)。用戶在某些UITextFields中輸入一些內容,然後按UIButton進行計算。如何選擇基於NSArray元素的方法(Objective-C)

我的NSArray是這樣的:

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

而我的方法被稱爲firstCalc(輸入1,輸入2,輸入3),secondCalc(輸入1,輸入2,輸入3),等等。 (輸入來自UITextFields。)

當我按下按鈕時,我想告訴它看看UIPickerView中的選擇是什麼,並且在不輸入if-then語句的情況下運行相應的方法每一個(由於特定於我的應用程序的原因,這很不方便,這超出了本討論的範圍)。

所以我已經定義了一個方法來確定所選擇的計算是什麼:

selectedCalc = [[NSString alloc] initWithString:[calcNames objectAtIndex: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]; 
     } 
    } 
} 

因此,基本上,它運行一個循環,直到找到計算器從UIPickerView選擇當它發現它,運行計算並顯示它們。

我一直在試圖理解,如果可能函數指針或選擇器(NSSelectorFromString?)是正確的事情在這裏使用,以及如何使用它們,但我真的很努力去了解幾天後的去向閱讀Apple的文檔,堆棧溢出問題,玩示例代碼,並修改我自己的代碼。

對不起,如果問題太長,我認爲這可能會對其他人在未來尋求幫助以查看完整想法更有幫助。 (至少我知道有時我失去了這些問題頁。)

我將是任何幫助非常感謝,

瑞安

回答

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:)}; 

調用那麼正確的方法是簡單的:

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

如果您需要更多然後2個參數,那麼你還需要使用NSInvocation實例來設置呼叫。

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;