Ios Obj C-NSUSERV默认值';加载视图后,t返回要计算的值

Ios Obj C-NSUSERV默认值';加载视图后,t返回要计算的值,ios,objective-c,uiviewcontroller,nsuserdefaults,Ios,Objective C,Uiviewcontroller,Nsuserdefaults,我遇到了一个小问题。我有一个基本的计算程序 Viewcontroller.m #import "ViewController.h" @interface ViewController () <UITextFieldDelegate, UIAlertViewDelegate> @end @implementation ViewController -(void)textFieldDidEndEditing:(UITextField *)textField { self.cu

我遇到了一个小问题。我有一个基本的计算程序

Viewcontroller.m

#import "ViewController.h"
@interface ViewController () <UITextFieldDelegate, UIAlertViewDelegate>
@end

@implementation ViewController
-(void)textFieldDidEndEditing:(UITextField *)textField
{

    self.currentSettings = _currentSettings;
    [self calculateThePrice];
}

-(void)calculateThePrice
{
    float wynik = self.currentSettings.kwh * self.currentSettings.price;
    self.priceLabel.text = [NSString stringWithFormat:@"%.02f %@", wynik , self.currentSettings.currency];
}
#导入“ViewController.h”
@界面视图控制器()
@结束
@实现视图控制器
-(void)textfielddidediting:(UITextField*)textField
{
self.currentSettings=\u currentSettings;
[自行计算价格];
}
-(无效)计算价格
{
float wynik=self.currentSettings.kwh*self.currentSettings.price;
self.priceLabel.text=[NSString stringWithFormat:@“%.02f%@”,wynik,self.currentSettings.currency];
}
设置svc.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];
    [priceDef synchronize];
    [currencyDef synchronize];
}

-(void)viewWillDisappear:(BOOL)animated
{
    NSString *textOfPriceTexField = _priceTextField.text;
    [[NSUserDefaults standardUserDefaults] setObject:textOfPriceTexField forKey:@"priceCall"];
}
#导入“SettingsVC.h”
@接口设置SVC()
@结束
@实现设置SVC
#pragma标记-UserDefaults实现
-(无效)视图将显示:(BOOL)动画
{
[self-createCurrencyArray];
NSUserDefaults*priceDef=[NSUserDefaults standardUserDefaults];
NSString*priceDefText=[priceDef stringForKey:@“priceCall”];
_priceTextField.text=priceDefText;
NSUserDefaults*currencyDef=[NSUserDefaults standardUserDefaults];
[\u currencyPicker selectRow:[currencyDef IntegerWorkey:@“currencyCall”]
不完整:0动画:否];
[价格定义同步];
[当前定义同步];
}
-(无效)视图将消失:(BOOL)已设置动画
{
NSString*textofPriceTextField=\u priceTextField.text;
[[NSUserDefaults standardUserDefaults]setObject:TextOfPriceTextField forKey:@“priceCall”];
}
现在的问题是,当我想让程序自动计算时,它不会。要得到任何结果,我必须切换到第二个视图,从选择器中选择一个值,然后当我返回时,我得到我的结果。 但是 -当我改变第一屏上的值时,结果不会改变。当我更改第二个屏幕上的值时,结果不会更改。但是当我改变PickerView-TADAH-result更新的值时

  • 当我转到第二个视图,再回到第一个视图,然后再转到第二个视图,再回到第一个视图时,我的结果更改为“0.00(NULL)”

知道我哪里做错了吗?我认为这是关于NSUserDefaults的,我尝试了许多选项,但都没有成功,也没有更改任何内容。

设置新值时,需要同步NSUserDefaults。检索值时使用的是同步

在这里,您不需要两个指向默认值的指针,也不需要同步:

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

_priceTextField.text = priceDefText;   

[_currencyPicker selectRow:[priceDef integerForKey:@"currencyCall"] inComponent:0 animated:NO];
这里您需要同步:

-(void)viewWillDisappear:(BOOL)animated 
{

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


-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    NSInteger selectedRow = [_currencyPicker selectedRowInComponent:0];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setInteger:selectedRow forKey:@"currencyCall"];
    [defaults synchronize];

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

    //[self userDidFinishSetting];
}
试试这个代码

-(void)viewWillDisappear:(BOOL)animated
{
     NSString *textOfPriceTexField = _priceTextField.text;
     [[NSUserDefaults standardUserDefaults] setObject:textOfPriceTexField forKey:@"priceCall"];
}
-(void)viewWillAppear:(BOOL)animated
{
    [self createCurrencyArray];  
    NSUserDefaults *priceDef = [NSUserDefaults standardUserDefaults];
    NSString *priceDefText = [priceDef objectForKey:@"priceCall"];
}

代替stringForKey,您可以调用objectForKey,与IntegerWorkey相同,您也可以调用objectForKey。实际上,您设置的对象不是字符串或整数。

float wynik->使用区域语言总是非常糟糕的做法。顺便说一句:Witamy;)。您也可以调用
[NSUserDefaults synchronize]
立即保存到
NSUserDefaults
UserDefaults
pragma标记位于错误的位置,因为您使用了viewwillispect等方法-这是视图生命周期。您应该为nsuserdefaults分离方法,调用它们,并仅向我们显示该调用,您发布的其余代码很难阅读。您的代码仅在ViewDidDisplay上更新,并且您希望它能够一直工作。您应该在操作后调用该函数重新加载数据(例如单击键盘上的
=
按钮)。感谢您指出我发布了太多的代码-我认为如果粘贴与这些方法相关的任何内容会更好。首先清理您的代码:1。您不需要将
同步
发送到
NSUserDefaults
。1.1. 这是由系统完成的。1.2. 您不会更改内容。2.
priceDef
currencyDef
引用相同的唯一用户默认数据库。获得一次参考。3.使用格式化程序。(这与您的问题无关。)检查是否调用了
-textfielddidediting:
。(设置断点或记录消息。)如果未设置,是否设置了代理引用?@AminNegm Awad-1。删除同步化,2。改为“def”,3。将来调用
-textfielddidediting:
,是。你能解释一下这个“代理引用”吗?我有一个
@interface ViewController()
为什么不投票[?]不幸的是,你的解决方案不起作用。嗯,我认为这不是问题的根源,因为文本字段在NSUserDefaults中保存得很好!问题在于UIPickerView,在ViewWillDisplay/DisPaper上,它的值为null。