我已经完成了基本构建,它包含了一个选择器。因此,无论用户从选择器中选择何种转换单位,都应更新标签以显示该转换的单位名称,一旦用户在文本框中输入数字并点击按钮,答案应显示在第二个文本框。现在代码执行,但问题是无论我在选择器中选择什么,它总是进行重量转换。我知道我需要一个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
}
*/
答案 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/
希望有所帮助!