4

コンバーターアプリを持っていますが、テキストフィールドに数値(変換する必要があります)を入力するたびにラベルを更新したいと思います。自動的に更新したいので、更新するためにホイール上のユニットを再度選択する必要はありません。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

これが私のコードです:

- (void)viewDidLoad
{
   [super viewDidLoad];
  {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    _convertFrom = @[@"MTPA", @"MMcf/day",
    @"Mill.Sm3/day", @"MMBTU", @"Boe/day"];

    _convertRates = @[ @1.0f, @133.4246575f, @3.780821918f,
    @142465.7534f, @23780.8f];

    _convertTo = @[@"MTPA", @"MMcf/day",
    @"Mill.Sm3/day", @"MMBTU", @"Boe/day"];

    _convertRates = @[ @1.0f, @133.4246575f, @3.780821918f,
    @142465.7534f, @23780.8f];
}
}

shuold私はここで何かをしますか?

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];

}

-(IBAction)textFieldReturn:(id)sender
{
    [sender resignFirstResponder];
}
-(IBAction)backgroundTouched:(id)sender
{
    [inputText resignFirstResponder];
}


#pragma mark -
#pragma mark PickerView DataSource

 - (NSInteger)numberOfComponentsInPickerView:
(UIPickerView *)pickerView
{
return 2;
}

 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:      (NSInteger)component
  {
 if (component == 0)  {
    return [_convertFrom count];
}
return [_convertTo count];
}


 - (NSString *) pickerView: (UIPickerView *)pickerView
          titleForRow:(NSInteger)row
         forComponent:(NSInteger)component
{
if (component == 0) {
    return [_convertFrom objectAtIndex:row];
}
return [_convertTo objectAtIndex:row];
}




 #pragma mark -
 #pragma mark PickerView Delegate
 -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row
   inComponent:(NSInteger)component

 {
 float convertFrom = [[_convertRates objectAtIndex:[pickerView selectedRowInComponent:0]]     floatValue];
 float convertTo = [[_convertRates objectAtIndex:[pickerView selectedRowInComponent:1]] floatValue];

float input = [inputText.text floatValue];
float to = convertTo;
float from = convertFrom;
float convertValue = input;
float relative = to / from;
float result = relative * convertValue;
NSString *convertFromName = [_convertFrom objectAtIndex:[pickerView selectedRowInComponent:0]];
NSString *convertToName = [_convertFrom objectAtIndex:[pickerView selectedRowInComponent:1]];


NSString *resultString = [[NSString alloc]initWithFormat:
                          @" %.4f %@ = %.4f %@",convertValue, convertFromName, result, convertToName];
resultLabel.text = resultString; 



}
4

1 に答える 1

3

あなたの質問は、ピッカー ビューとは関係ありません。テキスト フィールドへの変更をリッスンし、テキスト フィールドに入力された最新のテキストに基づいて変換とラベルを更新します。

  1. 値が変更されたときにテキスト フィールドで呼び出されるメソッドをセットアップします。
  2. 変換を計算してラベルを更新するピッカー ビュー デリゲート メソッドのすべてのコードは、2 つの場所から呼び出すことができる別のメソッドに配置する必要があります。
  3. テキスト フィールドの変更に反応する新しいメソッドで、変換を実行してラベルを更新する、作成したばかりのメソッドを呼び出します。

したがって、この時点で、ピッカー ビュー デリゲート メソッドとテキスト フィールド変更メソッドの両方が、ピッカーからの変換とテキスト フィールドからのテキストを取得するメソッドを呼び出し、変換を行い、最後にラベルを更新します。

編集:詳細

現在のピッカー ビュー デリゲート メソッドを次のようにリファクタリングします。

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    [self updateConversionLabel];
}

- (void)updateConversionLabel {
    float convertFrom = [[_convertRates objectAtIndex:[pickerView selectedRowInComponent:0]] floatValue];
    float convertTo = [[_convertRates objectAtIndex:[pickerView selectedRowInComponent:1]] floatValue];

    float input = [inputText.text floatValue];
    float to = convertTo;
    float from = convertFrom;
    float convertValue = input;
    float relative = to / from;
    float result = relative * convertValue;
    NSString *convertFromName = [_convertFrom objectAtIndex:[pickerView selectedRowInComponent:0]];
    NSString *convertToName = [_convertFrom objectAtIndex:[pickerView selectedRowInComponent:1]];

    NSString *resultString = [[NSString alloc]initWithFormat:
        @" %.4f %@ = %.4f %@",convertValue, convertFromName, result, convertToName];
    resultLabel.text = resultString; 
}

次に、テキスト フィールドへの変更を処理するメソッドを作成する必要があります。

- (void)textFieldChanged:(UITextField *)textField {
    [self updateConversionLabel];
}

IB で、メソッドをテキスト フィールドtextFieldChanged:の「値変更」イベントに接続します。inputText私は IB を使用しないので、それを行うための正確な用語がわかりません。

于 2012-10-21T16:06:13.170 に答える