Objective C Action不会执行,除非我在PickerView中的值将被更改

时间:2015-07-21 14:48:40

标签: objective-c

我正在使用两个视图控制器的应用程序。在第一个是input1的一个文本字段和最终结果的标签。在第二个视图中,我有输入2的文本字段和一个用于当前值的PickerView。主要特点是:

  • 首次运行时,用户必须转到第二个ViewController并在Input2 txtfield和UIPicker上设置所需的值。它们由NSUserDefault函数存储 - 请注意,存储数据非常有效。

  • On 1st ViewController用户必须在txtfield中键入Integer,之后应在下面的标签上显示结果 - (input1 * input2)+ UIPickerValue

我的主要问题是:在input1 txtfield中键入值后,它应该是insantly计算(因为viewWillAppear中的calculate方法),但它没有。要获得结果,我必须切换到第二个视图并在UIPicker上选择值。没有它,结果是“0.00(null)”。你有什么想法我哪里出错了吗?我对此一无所知。 F.Y.I.还有另一个类设置,只有标题中的属性。

ViewController.m

@interface ViewController () <UITextFieldDelegate, UIAlertViewDelegate>

@end

@implementation ViewController


-(void) viewWillAppear:(BOOL)animated{

   self.energyTextField.delegate = self;
  [self calculateThePrice];



}

 -(void)userDidSetSettings:(Settings *)currentSettings{
    self.currentSettings = currentSettings;

    [self dismissViewControllerAnimated:NO completion:^(void){


    [self calculateThePrice];




    }];
}

(...)

# pragma mark Calculating and Segues Implementations

-(void)calculateThePrice

{
    float wynik = self.currentSettings.kwh * self.currentSettings.price;
    self.priceLabel.text = [NSString stringWithFormat:@"%.02f %@", wynik , self.currentSettings.currency];
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

{
    if([[segue identifier] isEqualToString:@"settingSegue"]){
        self.currentSettings = [[Settings alloc]init];
        self.currentSettings.kwh = (int)[self.energyTextField.text integerValue];


        SettingsVC *settingsVC = [segue destinationViewController];
        settingsVC.currentSettings = self.currentSettings;
        settingsVC.delegate = self;
    }
}

SettingsVC.m

#import "SettingsVC.h"


@interface SettingsVC () <UITextFieldDelegate>

@end

@implementation SettingsVC

#pragma mark - UserDefaults Implementation

-(void)viewWillAppear:(BOOL)animated{

    [self createCurrencyArray];


    NSUserDefaults *priceDef = [NSUserDefaults standardUserDefaults];
    NSString *priceDefText = [priceDef stringForKey:@"priceCall"];

    _priceTextField.text = priceDefText;   

    NSUserDefaults *currencyDef = [NSUserDefaults standardUserDefaults];
   [_currencyPicker selectRow:[currencyDef integerForKey:@"currencyCall"]
         inComponent:0 animated:NO];

}


-(void)viewWillDisappear:(BOOL)animated {


    NSString *textOfPriceTexField = _priceTextField.text;
    [[NSUserDefaults standardUserDefaults] setObject:textOfPriceTexField forKey:@"priceCall"];

}

(...)

- (IBAction)backButton:(id)sender {

    [self userDidFinishSetting];

}

-(void)userDidFinishSetting{
    [self.delegate userDidSetSettings:self.currentSettings];
}


-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{



    NSInteger selectedRow = [_currencyPicker selectedRowInComponent:0];
   [[NSUserDefaults standardUserDefaults] setInteger:selectedRow forKey:@"currencyCall"];


    self.currentSettings.currency = [self.currencyArray objectAtIndex:row];
    self.currentSettings.price = [self.priceTextField.text floatValue];

    //[self userDidFinishSetting];

}

编辑#2

我将方法更改为

-(void)textFieldDidEndEditing:(UITextField *)textField{

    self.energyTextField.delegate = self;
    [self calculateThePrice];
}

它更接近一步,但除非改变PickerValue,否则值仍然无法计算。

1 个答案:

答案 0 :(得分:1)

-viewWillAppear:方法是“转换”方法系列的一部分,它让视图控制器知道它的视图(视图控制器的view属性引用的对象)何时添加或删除视图层次结构(顺便说一下,这与绘制不同)。因此,当您输入文本时,该方法已经很久以前就已经运行了。

要获得所需效果,您需要UITextFieldDelegate协议中的方法。如果您只想对文本字段失去焦点采取行动,-textFieldDidEndEditing:就足够了。不要忘记将文本字段的delegate属性设置为实现该方法的对象。

ETA:看起来你的currentSettings对象只在执行segue时被分配。如果你在此之前尝试使用它,那么Objective C的“魔力”将产生一堆零来调用nil对象上的方法。还要确保您的Settings类从NSUserDefaults读取并将其属性初始化为合理的值,以防信息不存在。