我正在使用两个视图控制器的应用程序。在第一个是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,否则值仍然无法计算。
答案 0 :(得分:1)
-viewWillAppear:
方法是“转换”方法系列的一部分,它让视图控制器知道它的视图(视图控制器的view
属性引用的对象)何时添加或删除视图层次结构(顺便说一下,这与绘制不同)。因此,当您输入文本时,该方法已经很久以前就已经运行了。
要获得所需效果,您需要UITextFieldDelegate
协议中的方法。如果您只想对文本字段失去焦点采取行动,-textFieldDidEndEditing:
就足够了。不要忘记将文本字段的delegate
属性设置为实现该方法的对象。
ETA:看起来你的currentSettings
对象只在执行segue时被分配。如果你在此之前尝试使用它,那么Objective C的“魔力”将产生一堆零来调用nil对象上的方法。还要确保您的Settings
类从NSUserDefaults读取并将其属性初始化为合理的值,以防信息不存在。