我正在尝试使用Xcode制作转换计算器

时间:2017-09-24 20:21:39

标签: ios objective-c xcode

我已经完成了基本构建,它包含了一个选择器。因此,无论用户从选择器中选择何种转换单位,都应更新标签以显示该转换的单位名称,一旦用户在文本框中输入数字并点击按钮,答案应显示在第二个文本框。现在代码执行,但问题是无论我在选择器中选择什么,它总是进行重量转换。我知道我需要一个switch语句,但我不确定我需要如何或在哪里实现它。

另一个问题是标签更新,但只有按下“转换”按钮时,请帮我修复此问题。

这是我的ViewController.h文件

    #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 个答案:

答案 0 :(得分:0)

这不是理想的用户界面,会造成效率低下,但却是您的应用。我只是想指出你可能想花时间研究它的设计和结构。

至于你的问题的解决方案,我无法为你解决所有问题,但我会指出一些事情让你更容易。

标签未更新的原因是您在点击转换按钮之前没有更新任何内容。以下功能是您获取选择器新行的事件

 -(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 
        } 
    }

你的下一个问题是,你没有告诉你的转换&#34;函数当前选择了哪一行,并且您的条件if不执行任何操作。

在obj-c中,直接在变量上使用的条件语句基本上只是检查初始化。 if(x)只是意味着已将x初始化为变量= true,如果不是= false。在这种情况下,这可能不是你正在寻找的逻辑。

接下来,您似乎正在尝试将3个不同的功能链接到同一个按钮按下?这是你的上述if相关问题导致问题的地方,所有三个函数同时触发......但只有一个得到了最后的发言权。大概是你最后联系的那个,虽然我不能肯定地说。我建议使用单个功能来处理按钮按下,然后继续使用正确的方法。

最后,你永远不会告诉函数有关选择器状态的任何信息。您需要将其设置为IBOutlet,以便您的变量可以访问它。然后,您可以使用选择器的所选行功能来确定要使用的转换。

我突出显示的内容将解决您的问题,但我强烈建议您查看一些教程,以便您了解更多关于为什么会这样做的内容。我建议:https://www.raywenderlich.com/

希望有所帮助!