2017-09-24 9 views
-2

私は基本ビルドを作ってあり、それにはピッカーが含まれています。したがって、ユーザーがピッカーから選択した変換の単位が何であれ、その変換の単位の名前を表示するようにラベルを更新し、ユーザーがテキストボックスに数字を入力してボタンを押すと、その答えが2番目のテキストボックス。今度はコードが実行されますが、ピッカーで何を選んでも、問題は常にウェイト変換を行います。私はそこにswitch文が必要だと知っていますが、私はそれを実装する必要がどのように、どこにあるのかよくわかりません。私はXcodeを使って変換電卓を作ろうとしています

もう1つの問題はラベルが更新されていることですが、「変換」ボタンが押された場合にのみ問題になりますので、これを解決してください。

これは、これは理想的なUIではないと非効率を作成しますが、その

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController 
<UIPickerViewDelegate, UIPickerViewDataSource> { 

    IBOutlet UITextField *field1; 
    IBOutlet UITextField *field2; 
    IBOutlet UIPickerView *picker; 
    IBOutlet UILabel *label1; 
    IBOutlet UILabel *label2; 
} 
@property (weak, nonatomic) IBOutlet UILabel *textLabelData1; 
@property (weak, nonatomic) IBOutlet UILabel *textLabelData2; 

@property (nonatomic, retain) UIPickerView *picker; 

-(IBAction) currencyConvert:(id)sender; 
-(IBAction) weightConvert:(id)sender; 
-(IBAction) distanceConvert:(id)sender; 

@end 

これは私のViewController.mファイルです

 #import "ViewController.h" 

    @interface ViewController() 

    @end 

    @implementation ViewController 
    @synthesize picker; 

    static NSString *pd[3] = {@"Currency", @"Weight", @"Speed"}; 

    - (void)viewDidLoad { 
     [super viewDidLoad]; 
     // Do any additional setup after loading the view, typically from a nib. 

    } 


    - (void)didReceiveMemoryWarning { 
     [super didReceiveMemoryWarning]; 
     // Dispose of any resources that can be recreated. 
    } 

    #pragma mark UIPickerViewDelegate & UIPickerViewDataSource methods 
    -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
    { 
     return 1; 
    } 

    -(NSInteger)pickerView:(UIPickerView *)pickerView 
    numberOfRowsInComponent:(NSInteger)component 
    { 
     return 3; 
    } 

    -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow: 
    (NSInteger)row forComponent:(NSInteger)component; 
    { 
     return pd[row]; 
    } 

    -(void)pickerView:(UIPickerView *)pickerView didSelectRow: 
    (NSInteger)row inComponent:(NSInteger)component 
    { 
     NSLog(@"didSelectRow %li, inComponent: %li", row, component); 
    } 

    -(IBAction)currencyConvert:(id)sender 
    { 
     if (pd[0]) 
     { 
      self.textLabelData1.text = @"Dollar"; 
      self.textLabelData2.text = @"Rupees"; 
      float dollar = [[field1 text] floatValue]; 
      float rupees = dollar * 64.15; 
      [field2 setText: [NSString stringWithFormat: @"%3.3f", rupees]]; 
     } 
     /* self.textLabelData1.text = @"Dollar"; 
     self.textLabelData2.text = @"Rupees"; 
     float dollar = [[field1 text] floatValue]; 
     float rupees = dollar * 64.15; 
     [field2 setText: [NSString stringWithFormat: @"%3.3f", rupees]]; */ 

    } 

    -(IBAction)weightConvert:(id)sender 
    { 
     if (pd[1]) 
     { 
     self.textLabelData1.text = @"Kilogram"; 
     self.textLabelData2.text = @"Lbs"; 
     float kilogram = [[field1 text] floatValue]; 
     float pounds = kilogram * 2.20462; 
     [field2 setText: [NSString stringWithFormat: @"%3.3f", pounds]]; 
     } 
    } 

    -(IBAction)distanceConvert:(id)sender 
    { 
     if (pd[2]) 
     { 
     self.textLabelData1.text = @"Mile"; 
     self.textLabelData2.text = @"Kilometer"; 
     float miles = [[field1 text] floatValue]; 
     float kilometers = miles * 1.60934; 
     [field2 setText: [NSString stringWithFormat: @"%3.3f", kilometers]]; 
     } 
    } 


    /* Pseudocode for switch statement 

    -- I tried doing this here, but it gives me an 
    error saying that "row" is undefined. I understand that 
    it is a local variable, but how else would I write the 
    switch statement? 

    Also, is the placement of the switch statement appropriate here 
    or will I need to implement it in a function? 


    switch (row) 
    { 
     case 1: 
      call currencyConvert 

     case2: 
      call weightConvert 

     case3: 
      call distanceConvert 
    } 
*/ 

The link to the picture of my Main.storyboard

+1

あなたの質問は「私の小さなプログラムをデバッグしてください」です。ここでの具体的な質問は何ですか、何を試しましたか – jdv

答えて

0

私ViewController.hファイルですあなたのアプリ。デザインと構造に取り組んで時間を費やしたいと思っているかもしれないと指摘したかっただけです。

あなたの問題の解決策として、私はあなたのためにすべてを修正することはできませんが、私はそれをより簡単にするためにいくつかの点を指摘します。


ラベルが更新されないのは、変換ボタンを押すまで何も更新していないためです。あなたはピッカーの新しい行のためのイベントを取得します

-(void)pickerView:(UIPickerView *)pickerView didSelectRow: 
    (NSInteger)row inComponent:(NSInteger)component 
    { 
     NSLog(@"didSelectRow %li, inComponent: %li", row, component); 
    } 

が代わりにこれを試してみてくださいどこ下記の機能は次のとおりです。

-(void)pickerView:(UIPickerView *)pickerView didSelectRow: 
    (NSInteger)row inComponent:(NSInteger)component 
    { 
     NSLog(@"didSelectRow %li, inComponent: %li", row, component); 
     switch (row) { 
      case 0: 
       self.textLabelData1.text = @"Dollar"; 
       self.textLabelData2.text = @"Rupees"; 
       break; 
      case 1: 
       // and so on 
     } 
    } 

あなたの次の問題は、あなたを言っていないということです「変換現在行が選択されていますが、条件付きifは何もしません。

変数に直接使用されるobj-c条件文では、基本的には初期化をチェックするだけです。 if(x)は単にxが変数= true、not = falseとして初期化されていることを意味します。これはおそらくあなたがこの場合に探している論理ではありません。

次に、同じボタンを3つの異なる機能にリンクしようとしていますか?これはあなたの上記のif関連の問題が問題を引き起こしているところで、3つの機能はすべて同時に発砲していますが、最後の発言は1つだけです。おそらく私はあなたが確かに言うことはできませんが、最後にリンクしたもの。私は、ボタンの操作を処理し、正しいメソッドにリレーする単一の関数を提案したいと思います。

最後に、ピッカーの状態について何も関数に伝えていません。変数がIBOutletにアクセスできるようにIBOutletとして設定する必要があります。次に、ピッカーの選択した行機能を使用して、使用する変換を決定することができます。私が強調し


の事はあなたの問題を解決しますが、あなたは物事が何をする理由について詳しく説明しますので、私は非常にいくつかのチュートリアルをチェックアウトすることをお勧めします。私はお勧めしたい:https://www.raywenderlich.com/

希望に役立つ!

+0

ありがとうございました!私はそれを試してみる。私はObjective-Cを初めて使っているので、少しの構文上の問題がありました。助けてくれてありがとう! – mdave1701

+0

心配する必要はありません、我々はすべてそこにいた:) –

関連する問題