Obj C - 加载视图后,NSUserDefaults 不会返回要计算的值

Posted

技术标签:

【中文标题】Obj C - 加载视图后,NSUserDefaults 不会返回要计算的值【英文标题】:Obj C - NSUserDefaults won't give back values to calculate, after loading the view 【发布时间】:2015-07-22 11:51:41 【问题描述】:

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

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

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];
    [priceDef synchronize];
    [currencyDef synchronize];


-(void)viewWillDisappear:(BOOL)animated

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

现在,问题是当我希望程序自动计算时,它不会。要得到任何结果,我必须切换到第二视图,从选择器中选择一个值,然后当我返回时,我得到了我的结果。 但... - 当我在第一个屏幕上更改值时,结果不会改变。当我在第二个屏幕上更改值时,结果不会改变。但是当我更改 PickerView 的值时 - TADAH - 结果更新!

当我转到第二个视图并返回第一个视图,然后再次转到第二个视图并返回第一个视图时,我的结果变为“0.00 (NULL)”...

有什么想法我做错了吗?我认为这是关于 NSUserDefaults,我尝试了很多选项,没有任何效果,也没有改变任何东西。

【问题讨论】:

float wynik -> 使用区域语言总是非常糟糕的做法。顺便说一句:威塔米;)。您也可以拨打[NSUserDefaults synchronize]'立即保存到NSUserDefaultsUserDefaults pragma 标记在错误的位置,因为您有 viewWillAppear 等方法 - 这是视图生命周期。您应该分离 nsuserdefaults 的方法,调用它们,然后只向我们展示该调用,您发布的其余代码很长,难以阅读。您的代码仅在 viewDidAppear 上更新,并且您希望它一直有效。您应该调用该函数以在操作后重新加载数据(例如单击键盘上的= 按钮)。 感谢您指出我发布了太多代码 - 我认为如果我粘贴与这些方法相关的任何内容会更好。 首先清理您的代码: 1. 您无需将synchronize 发送到NSUserDefaults。 1.1。它是由系统完成的。 1.2.您不更改内容。 2. priceDefcurrencyDef 指的是同一个唯一的用户默认数据库。一次获得参考。 3. 使用格式化程序。 (这与您的问题无关。) 检查是否调用了-textFieldDidEndEditing:。 (设置断点或记录消息。)如果没有,是否设置了委托引用? @AminNegm-Awad - 1. 删除 syncrhonize,2. 更改为“def”,3. 将来会调用 -textFieldDidEndEditing:,是的。你能解释一下这个“代表参考”吗?我有这个@interface ViewController () &lt;UITextFieldDelegate, UIAlertViewDelegate&gt; 【参考方案1】:

您需要在设置新值时同步 NSUserDefaults。您在检索值时正在使用同步。

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

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

【讨论】:

为什么要投反对票 [?] 不幸的是,你的灵魂没有奏效。【参考方案2】:

试试这个代码

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

你可以调用objectForKey而不是stringForKey,就像integerForKey一样,你也可以调用objectForKey。实际上,您设置的对象不是字符串或整数。

【讨论】:

嗯,我不认为这可能是问题的根源,因为 TextFields 保存在 NSUserDefaults 中恰到好处!问题在于 UIPickerView,在 viewWillAppear/Dissaper 上它的 value = null。

以上是关于Obj C - 加载视图后,NSUserDefaults 不会返回要计算的值的主要内容,如果未能解决你的问题,请参考以下文章

使用c ++和opengl加载.obj文件[关闭]

OpenGL:加载 3d 模型(比如 obj 文件)后如何找到正确的缩放因子? [关闭]

使用 Google Calendar API 加载库 - Obj C

如何在不重新加载页面的情况下运行我的视图功能? [关闭]

threejs加载geojson

openGL加载obj文件+绘制大脑表层+高亮染色