Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 添加到以前保存的NSUserDefault_Ios_Objective C_Delegates_Nsuserdefaults - Fatal编程技术网

Ios 添加到以前保存的NSUserDefault

Ios 添加到以前保存的NSUserDefault,ios,objective-c,delegates,nsuserdefaults,Ios,Objective C,Delegates,Nsuserdefaults,我正在为iOS制作一个游戏,在每个关卡中都有一个计分系统。这里我有一些代码,它通过使用委托获取NSString(passedValue1) 以下是代表的代码: LevelCompleteLevel1 .h #import "ViewController.h" @interface LevelCompleteLevel1 : UIViewController{ IBOutlet UILabel *label; ViewController *secondviewData; } @propert

我正在为iOS制作一个游戏,在每个关卡中都有一个计分系统。这里我有一些代码,它通过使用委托获取
NSString
passedValue1

以下是代表的代码:

LevelCompleteLevel1
.h

#import "ViewController.h"
@interface LevelCompleteLevel1 : UIViewController{
IBOutlet UILabel *label;

ViewController *secondviewData;
}
@property (nonatomic, retain)ViewController*secondviewData;
@interface ViewController : UIViewController{

IBOutlet UILabel *label;
NSString *passedValue1;
}
@property (nonatomic, retain)NSString *passedValue1;

@end
.m

ViewController *second = [[ViewController alloc] initWithNibName:nil bundle:nil];
self.secondviewData = second;
secondviewData.passedValue1 = label.text;
[self presentModalViewController:second animated:YES];
.m
中,我将a值从当前
视图控制器中的标签发送到另一个
视图控制器
中,我发送的值称为
passedValue1

发送完值后,我需要在我的
ViewController

ViewController
.h

#import "ViewController.h"
@interface LevelCompleteLevel1 : UIViewController{
IBOutlet UILabel *label;

ViewController *secondviewData;
}
@property (nonatomic, retain)ViewController*secondviewData;
@interface ViewController : UIViewController{

IBOutlet UILabel *label;
NSString *passedValue1;
}
@property (nonatomic, retain)NSString *passedValue1;

@end
.m

ViewController *second = [[ViewController alloc] initWithNibName:nil bundle:nil];
self.secondviewData = second;
secondviewData.passedValue1 = label.text;
[self presentModalViewController:second animated:YES];
首先我<代码>@passedValue1

然后我添加代码以接收my
viewDidLoad
中的值,并在
UILabel

- (void)viewDidLoad
{ 

[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib
NSString *key=@"labelKey";

// Do any additional setup after loading the view, typically from a nib
if(passedValue1){
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

    NSObject * object = [prefs objectForKey:key];
    if(object != nil){
        NSUserDefaults *defults = [NSUserDefaults standardUserDefaults];
        [defults setObject:passedValue1 forKey:key];
        [defults synchronize];
    }
    else{
        NSUserDefaults *defults = [NSUserDefaults standardUserDefaults];

        NSInteger readScore=[[[NSUserDefaults standardUserDefaults] objectForKey:key] integerValue];
        NSInteger newValue=readScore+[passedValue1 integerValue];
        [defults setObject:[NSString stringWithFormat:@"%d",newValue] forKey:key];
        [defults synchronize];
    }
}
label.text = [[NSUserDefaults standardUserDefaults]objectForKey:key];
}

显示值后,使用
NSUserDefault
将其保存到标签中。但是,一旦我重播了我的游戏并获得了另一个分数值,我想将新的
passedValue1
值添加到当前保存的值中

例如:

假设我发挥我的水平,我得到的分数值为10。然后保存该值,然后我重播我的级别。然后,我想获取保存的值,并将其添加到我刚刚获得的值中。也就是说,我得到的第二个值是20。然后我希望我的代码将它们相加,并给我一个值30

任何人都可以帮助我,因为我使用的代码没有正确执行我想要执行的功能,即添加上一个和当前传递的值

提前谢谢

编辑 Iam使用此代码:

 - (void)viewDidLoad
{ 

[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib
NSString *key=@"labelKey";

// Do any additional setup after loading the view, typically from a nib
if(passedValue1){
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

    NSObject * object = [prefs objectForKey:key];
    if(object != nil){
        NSUserDefaults *defults = [NSUserDefaults standardUserDefaults];
        [defults setObject:passedValue1 forKey:key];
        [defults synchronize];
    }
    else{
        NSUserDefaults *defults = [NSUserDefaults standardUserDefaults];

        NSInteger readScore=[[[NSUserDefaults standardUserDefaults] objectForKey:key] integerValue];
        NSInteger newValue=readScore+[passedValue1 integerValue];
        [defults setValue:[NSString stringWithFormat:@"%d",newValue] forKey:key];
        [defults synchronize];
    }
}
     label.text = [[NSUserDefaults standardUserDefaults]objectForKey:key];
       }
为什么这不起作用,标签的显示值是最初传递的值1?

两件事

  • 在添加NSString时,使用
    setValue:forKey:
    方法就足够了。(不是setObject:forKey,因为您正在使用)

  • NSUserDefaults
    是一种基于键的值保存机制。如果尝试将值保存在同一个键中,则保存的值将替换为当前保存的值

  • 因此,在您的情况下,只需使用新值调用同一个键,旧值就会被新值替换。

    尝试此键后

      NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
        [defaults setObject:@"10" forKey:@"old value"];
        [defaults synchronize];
    
        int k=[[defaults objectForKey:@"old value"] intValue]+newValue;
    

    尝试使用setValue而不是setObject。您现在的问题是什么?获取此值secondviewData.passedValue1=label.text;(passedValue1)r没有?你能检查我的编辑并告诉我我做错了什么吗。谢谢你检查我的编辑,告诉我我做错了什么。谢谢你检查我的编辑,告诉我我做错了什么。谢谢