我正在尝试在 50 岁左右的 iOS 开发入门课程中的最终项目的多个视图中共享字符串和整数,我想知道我将如何去做……我知道 MVC 范式是最好的,但我们没有没有得到非常先进的东西,尤其是核心数据。我正在考虑使用 NSUserDefaults,我知道这是错误的,但这个应用程序不必非常快,我认为这对我来说是最简单的方法。我的问题是,我将在哪里以及如何声明我将使用的 NSUserDefault 对象?我们在课堂上唯一一次使用它是在一个视图中。如果我在加载的第一个视图中声明它,我知道我可以使用其他视图访问它,但是我是否需要将第一个视图的头文件导入到其他每个视图中,或者无论如何都可以访问它?
更新
所以我想我会尝试通过NSUserDefaults
在所有ViewControllers
. 然后,为了尝试取回这些值,我将每个的标题实现ViewControllers
到需要访问存储在 NSUserDefaults 中的数据(也有一个NSUserDefault
属性)的视图中。该应用程序运行得非常好,直到我进入该屏幕并且没有任何更新。我确定我的错误在于我如何实施 NSUserDefaults
但我不确定如何正确地做到这一点。当我们在课堂上复习它们时(实际上是“Sam's Teach Yourself iPhone Application Development in 24 Hrs”的定向研究(呕吐,这让我很生气)),我们唯一一次使用它们是在单一视图应用程序中改变了白色背景的 alpha,因此它可以用作闪光灯。它是这样呈现的:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setInteger: var forKey: kVar];
[userDefaults synchronize];
这是我在我的应用程序中尝试的:
在我ViewController.h
的每个视图的文件中:
...
@interface AppetizerViewController : UIViewController{
NSUserDefaults *userDefaults;
...
}
@property(assign)NSUserDefaults *userDefaults;
然后,当我单击一个按钮时,我想将该值保存到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 个小时,几乎没有休息,这是明尼苏达州凌晨 4:00 左右。我该怎么办?我也很抱歉,它可能必须明确说明如何实现它。