如何让 UIPickerview 自动更新 UILabel

Posted

技术标签:

【中文标题】如何让 UIPickerview 自动更新 UILabel【英文标题】:How can i get UIPickerview to update UILabel automatically 【发布时间】:2012-10-21 15:19:40 【问题描述】:

我有一个转换器应用程序,我希望它在我将数字(应该转换的)输入到文本字段时更新标签。我希望它自动更新,所以我不需要再次选择***上的单元来更新它。

这是我的代码:

- (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];


我应该在这里做什么?

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




【问题讨论】:

您的意思是当您键入要执行转换计算的数字时?在您的屏幕截图中,我没有看到 UIPickerView,所以我无法弄清楚您在问什么。 @Walter 我希望它按照你在第一句话中所说的那样做。认为当您可以看到没有数字的标签,然后看到带有数字的文本字段时,这是可以理解的。我希望它立即说 123 = 452 :) 啊,那么下面Maddy的回答是正确的。您只需要从 textField 的委托方法调用您的转换函数。您要使用的方法是: - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 您应该调用进行转换的方法,然后让委托方法返回 YES 所以屏幕将更新。 @Walter - 这不是正确的方法。该方法将用于验证文本字段的输入。它不应该用于对文本字段的更改采取行动。请参阅我的更新答案。 【参考方案1】:

您的问题与选择器视图无关。您想监听文本字段的更改并根据输入文本字段的最新文本更新转换和标签。

    设置在文本字段值更改时调用的方法。 选择器视图委托方法中计算转换和更新标签的所有代码都需要放在另一个可以从两个位置调用的方法中。 在对文本字段中的更改做出反应的新方法中,调用您刚刚创建的方法来执行转换并更新标签。

所以此时您的选择器视图委托方法和您的文本字段更改方法都调用从选择器获取转换的方法和从文本字段中获取文本,然后进行转换,最后更新标签。

编辑:更多细节

像这样重构当前的选择器视图委托方法:

-(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,所以我不知道这样做的确切术语。

【讨论】:

@Walter 这不是我所采用的方法。 对不起。我只是想帮忙。您能否添加方法名称,因为我认为 OleB 无论如何都会要求它。 @Walter - 该方法将以任何 OP 的名称命名。我说的是与文本字段的 UIControlEventValueChanged 控件事件相关联的方法。 @rmaddy 你们都让我有点困惑。我不太擅长编程,所以如果你能举个例子什么的会有所帮助:) @OleB 你在使用Interface Builder吗?

以上是关于如何让 UIPickerview 自动更新 UILabel的主要内容,如果未能解决你的问题,请参考以下文章

我可以在不按任何选择按钮的情况下从我的 uipickerview 行的值自动更新我的 uitextview 吗?

从 UIPickerView 接收输入时如何更新 UITextField?

如何让我的 UIPickerView 显示数组的所有元素

你如何让 UIPickerView 组件环绕?

单独页面上的 UIPickerView

更新 UIPickerView 行数