如何实现NSUserDefault通过多个视图进行访问

我试图在一个介绍性的iOS开发课程中的大多数视图中分享string和整数在50左右,我想知道如何去做这个…我知道MVC的范例是最好的,但我们没有,没有先进的东西,特别是核心数据。 我正在考虑使用NSUserDefaults,我知道这是错误的,但这个应用程序不必非常快,我认为这将是最简单的方法。 我的问题是,我会在哪里以及如何声明NSUserDefault对象? 我们使用的唯一一次是在一个视图中。 如果我在加载的第一个视图中声明它,我知道我可以用其他视图来访问它,但是我需要将第一个视图的头文件导入到其他视图中,还是可以访问?


更新


所以我想我会尝试通过在所有ViewControllers NSUserDefaults属性变得更容易。 然后尝试获取值,我将每个ViewControllers的头部实现到需要访问存储在NSUserDefaults(也具有NSUserDefault属性)中的数据的视图中。 该应用程序运行非常好,直到我到达该屏幕,没有更新。 我敢肯定我的错误在于我如何实现NSUserDefaults但我不确定如何正确执行。 当我们在课堂上讲过他们的时候(实际上这是一个有关“山姆的24小时自学iPhone应用程序开发”的定向研究(呕吐,这让我很愤怒)),我们唯一一次使用它们是在一个单一的视图应用程序,所以它可以用作闪光灯的白色背景的alpha。 这是如何提出的:

 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setInteger: var forKey: kVar]; [userDefaults synchronize]; 

这是我在我的应用程序尝试:

在我的ViewController.h文件中查看每个视图:

 ... @interface AppetizerViewController : UIViewController{ NSUserDefaults *userDefaults; ... } @property(assign)NSUserDefaults *userDefaults; 

然后当我点击一个button,我想保存该值到userDefaults

 -(IBAction)plusEgg:(id)sender{ eggs++; eggString = [NSString stringWithFormat:@"%d",eggs]; eggQty.text = eggString; eggOrderedQty.text = eggString; [userDefaults setInteger:eggs forKey:kEggQty]; [userDefaults synchronize]; [self updateAppSubtotal]; } -(IBAction)minusEgg:(id)sender{ eggs--; if(eggs < 0){ eggs = 0; } eggString = [NSString stringWithFormat:@"%d",eggs]; eggQty.text = eggString; eggOrderedQty.text = eggString; [userDefaults setInteger:eggs forKey:kEggQty]; [userDefaults synchronize]; [self updateAppSubtotal]; } 

然后,因为我在所有视图的头文件中拥有NSUserDefault Keys所有常量,所以我将所有头文件像这样实现到了BillViewController并试图像这样访问它们:

 -(void)populateLabels{ pieFinalQty.text = [NSString stringWithFormat:@"%d", [userDefaults integerForKey:kPieQty]]; hazFinalQty.text = [NSString stringWithFormat:@"%d", [userDefaults integerForKey:kHazQty]]; briFinalQty.text = [NSString stringWithFormat:@"%d", [userDefaults integerForKey:kBriQty]]; choFinalQty.text = [NSString stringWithFormat:@"%d", [userDefaults integerForKey:kChoQty]]; iceFinalQty.text = [NSString stringWithFormat:@"%d", [userDefaults integerForKey:kIceQty]]; } -(void)getSubtotal{ NSString *preSubString; NSString *subString; subFloat = [userDefaults floatForKey:kAppSub]+[userDefaults floatForKey:kBevSub]+ [userDefaults floatForKey:kDesSub]+ [userDefaults floatForKey:kEntSub]+[userDefaults floatForKey:kSidSub]; if(subFloat < 10){ preSubString = [[NSString alloc]initWithFormat:@"%1.2f",subFloat]; }else if(subFloat < 100 && subFloat >= 10){ preSubString = [[NSString alloc]initWithFormat:@"%2.2f",subFloat]; }else if(subFloat < 1000 && subFloat >= 100){ preSubString = [[NSString alloc]initWithFormat:@"%3.2f",subFloat]; }else{ preSubString = [[NSString alloc]initWithFormat:@"%4.2f",subFloat]; } subString = [[NSString alloc]initWithFormat:@"$%@",preSubString]; billSubtotal.text = subString; [preSubString release]; [subString release]; } 

对不起,你们试图向我解释的东西显然已经完全凌驾于我的头上了,而且我的命名规则还不错,但是我已经连续工作了大约15个小时,几乎没有rest,明尼苏达州大约凌晨4点在这里。 我怎样才能解决这个问题? 我也很抱歉,如何实施它可能必须是明确的。

关于NSUserDefaults是你不需要在任何地方实例化它:它已经可以从应用程序的任何地方访问到。 只要调用[NSUserDefaults standardUserDefaults] ,并读取或写入该对象。 调用对象上的synchronize以确保更改存储在磁盘上,然后下一个您检索standardUserDefaults对象的位置将获得更新的信息。

编辑:根据您的上述代码,您可以进行以下更改以使用标准用户默认对象:

  1. 摆脱你的@property (assign) NSUserDefaults userDefaults; 和你的成员variablesNSUserDefaults userDefaults;
  2. 在任何你想读取或写入用户默认值的地方,创build一个临时variables: NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

另一种方式,你可以做,似乎是你想要做的,将设置@property是标准的用户默认对象,所以它不必通过调用standardUserDefaults检索(因为它似乎你使用它很多,这可能是你应该去的方式)。

要这样做:

  1. 留下你的@property ,但将其设置为(retain)而不是(assign)standardUserDefaults对象是autorelease d,所以你需要自己坚持)。 (可选)您可以删除NSUserDefaults userDefaults; 行,因为@property无论如何创build这个
  2. 当你初始化你的视图控制器(或在viewDidLoad ,就像我在这里所做的那样),将userDefaultsvariables设置为标准的用户默认值对象:

     - (void)viewDidLoad { [super viewDidLoad]; self.userDefaults = [NSUserDefaults standardUserDefaults]; } 
  3. 在与初始化方法相对应的方法中释放用户默认variables( dealloc用于init方法,或者viewDidUnload用于viewDidLoad ):

     - (void)viewDidUnload { self.userDefaults = nil; } 

没有什么可以“申报”。 每当你说[NSUserDefaults standardUserDefaults]你正在访问用户的默认值,无论你从哪里说。 如果您需要设置默认的默认值(即某些键的初始值),请在程序中尽早完成,例如在应用程序委托的applicationDidFinishLaunching调用registerDefaults

如果你正在使用NSUserDefaults很多,那么创build一个类别可能会很方便,以确保你不会在你的键中input错字。 例如说,我经常得到和设置值,让编译器做一些检查,以确保我不input错误的键,当然我们都喜欢自动完成。

 // NSUserDefaults+PSProperties.h @interface NSUserDefaults (PSProperties) @property (nonatomic, assign) NSInteger ps_myInteger; @end // NSUserDefaults+PSProperties.m NSString * const PSKeyMyInteger = @"PSKeyMyInteger"; @implementation NSUserDefaults (PSProperties) - (NSInteger)ps_myInteger; { return [self integerForKey:PSKeyMyInteger]; } - (void)setPs_myInteger:(NSInteger)ps_myInteger; { [self setInteger:ps_myInteger forKey:PSKeyMyInteger]; } @end 

因此,在我使用用户默认的其他类中,我可以这样做:

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; defaults.ps_myInteger = 5; [defaults synchronize]; NSLog(@"%i", defaults.ps_myInteger); > 2011-12-14 01:10:28.041 SampleUserDefaults[5356:f803] 5 

现在所有的键都隐藏了,我使用一个更好的API与NSUserDefaults交互, NSUserDefaults API与我的应用程序相关。