NSUserDefaults的使用 (收集)

创建一个user defaults方法有多个,最简单得快速创建方法:

   NSUserDefaults *accountDefaults = [NSUserDefaults standardUserDefaults];


添加数据到 user defaults:

   [accountDefaults setObject:nameField.text forKey:UserDefaultNameKey];

也可以添加基本数据类型int, float, bool等,有相应得方法

   [accountDefaults setBool:YES forKey:UserDefaultBoolKey];


user defaults中获取数据:

   [accountDefaults objectForKey:NCUserDefaultNameKey]

  

 [accountDefaults boolForKey: UserDefaultBoolKey];


要点: NSUserDefaults非常好用,并不需要用户在程序中设置NSUserDefaults的全局变量,需要在哪里使用NSUserDefaults的数据,那么就在哪里创建一个NSUserDefaults对象,然后进行读或者写操作。

     针对同一个关键字对应的对象或者数据,可以对它进行重写,重写之后关键字就对应新的对象或者数据,旧的对象或者数据会被自动清理。



以下是一个我自己写的例子,通过checkBtn按钮进行保存用户名和密码:

NSUserDefaults的使用 - 木木 - 木木的博客

     图片一:保存数据之前;或者上一次没有保存数据,第二次启动的界面


NSUserDefaults的使用 - 木木 - 木木的博客
     图片二:保存了数据,第二次打开所看到的启动初始界面
 
- (void)defaultCheck:(id)sender

{   

NSLog(@" check按钮被按下   ");

NSUserDefaults *accountDefaults = [NSUserDefaults standardUserDefaults];

if ([accountDefaults boolForKey:NCUserDefaultBoolForRegister] == NO)

{

((UIButton*)sender).selected = YES;

[accountDefaults setBool:YES forKey:NCUserDefaultBoolForRegister];

[accountDefaults setObject:nameField.text forKey:NCUserDefaultNameKey];

[accountDefaults setObject:pwdField.text forKey:NCUserDefaultPasswordKey];

}

else {//YES

((UIButton*)sender).selected = NO;

[accountDefaults setBool:NO forKey:NCUserDefaultBoolForRegister];

[accountDefaults setObject:nil forKey:NCUserDefaultNameKey];

[accountDefaults setObject:nil forKey:NCUserDefaultPasswordKey];

}

}

- (void)loadView {

[super loadView];

nameField = [[UITextField alloc]initWithFrame:CGRectMake(0, 0, 100, 30)];

pwdField = [[UITextField alloc]initWithFrame:CGRectMake(0, 0, 100, 30)];

[nameField setCenter:CGPointMake(160, 100)];

[pwdField setCenter:CGPointMake(160, 150)];

NSUserDefaults *accountDefaults = [NSUserDefaults standardUserDefaults];

//存的是bool值一定要用boolForKey:获取

//如果之前已经保存了User Defaults,那么在读取的时候就要将数据读取出来,显示在用户名和密码框中(这里没有加密)。

if ([accountDefaults boolForKey:NCUserDefaultBoolForRegister] == YES) {

nameField.text = [accountDefaults objectForKey:NCUserDefaultNameKey];

pwdField.text = [accountDefaults objectForKey:NCUserDefaultPasswordKey];

}
else

{

   [nameField setPlaceholder:@"用户名"];

       [pwdField setPlaceholder:@"密码"];

}

nameField.borderStyle = UITextBorderStyleBezel;

[pwdField setBorderStyle:UITextBorderStyleRoundedRect];

[self.view addSubview:nameField];

[self.view addSubview:pwdField];

UIButton * loginBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

[loginBtn setFrame:CGRectMake(0, 0, 50, 30)];

[loginBtn setCenter:CGPointMake(200, 200)];

[loginBtn addTarget:self action:@selector(loginToWeiBo:) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:loginBtn];

UIButton * checkBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

[checkBtn setFrame:CGRectMake(0, 0, 20, 20)];

[checkBtn setCenter:CGPointMake(160, 180)];

//选中之后得图标

[checkBtn setBackgroundImage:[UIImage imageNamed:@"lock.png"] forState:(UIControlState)UIControlStateHighlighted];

[checkBtn setBackgroundImage:[UIImage imageNamed:@"lock.png"] forState:(UIControlState)UIControlStateSelected];

    //未选中

[checkBtn setBackgroundImage:[UIImage imageNamed:@"unlock.png"] forState:(UIControlState)UIControlStateNormal];

[checkBtn addTarget:self action:@selector(defaultCheck:) forControlEvents:UIControlEventTouchUpInside];

//用户名和密码已经保存

if([accountDefaults boolForKey:NCUserDefaultBoolForRegister] == YES) 

{

[checkBtn setSelected:YES];

}

[self.view addSubview:Btn];

}




NSUserDefaults读取和写入自定义对象

NSUserDefaults可以存取一些短小的信息。

比如存入再读出一个字符串到NSUserDefaults:


NSString *string = [NSString stringWithString @"hahaha"];  
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];  
[ud setObject:string forKey:@"myKey"];  
NSString *value;  
value = [ud objectForKey:"myKey"];


 

但是并不是所有的东西都能往里放的。NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.

 

如果把一个自定义的类存到一个NSArray里,然后再存到NSUserDefaults里也是不能成功的。不信可以试试,如果你成功的请告诉我。

那怎么办呢?

 

我找到的方法是,让这个自定义类实现<NSCoding>协议中的- (id) initWithCoder: (NSCoder *)coder方法和- (void) encodeWithCoder: (NSCoder *)coder方法(obj-c的协议protocol就是java的接口interface,就是C++的纯虚函数),然后把该自定义的类对象编码到NSData中,再从NSUserDefaults中进行读取。

 

粘代码:

假设有这样一个简单的类对象

    @interface BusinessCard : NSObject <NSCoding>{  
        NSString *_firstName;  
        NSString *_lastName;  
    }  
    @property (nonatomic, retain) NSString *_firstName;  
    @property (nonatomic, retain) NSString *_lastName;  
    @end;  
      
    @implementation BusinessCard  
    @synthesize _firstName, _lastName;  
    - (void)dealloc{  
        [_firstName release];  
        [_lastName release];  
        [super dealloc];  
    }  
    - (id) initWithCoder: (NSCoder *)coder  
    {  
        if (self = [super init])  
        {  
            self._firstName = [coder decodeObjectForKey:@"_firstName"];  
            self._lastName = [coder decodeObjectForKey:@"_lastName"];  
        }  
        return self;  
    }  
    - (void) encodeWithCoder: (NSCoder *)coder  
    {  
        [coder encodeObject:_firstName forKey:@"_firstName"];  
        [coder encodeObject:_lastName forKey:@"_lastName"];  
          
    }  
      
    @end  


然后再存取时通过NSData做载体:

BusinessCard *bc = [[BusinessCard alloc] init];  
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];  
NSData *udObject = [NSKeyedArchiver archivedDataWithRootObject:bc];  
[ud setObject:udObject forKey:@"myBusinessCard"];  
[bc release];  
udObject = nil;  
udObject = [ud objectForKey:@"myBusinessCard"];  
bc = [NSKeyedUnarchiver unarchiveObjectWithData:udObject] ; 


 

以上的代码时由另一个程序中截取的,没有测试过,但意思就是这样了。

如果一个自定义类中由另一个自定义类对象,那么所有嵌套的类都要实现<NSCoding>。




    NSUserDefaults *store = [NSUserDefaults standardUserDefaults];    
    NSUInteger selectedIndex = 1;  
    [store setInteger:selectedIndex forKey:@"selectedIndex"];  
          
    if ([store valueForKey:@"selectedIndex"] != nil) {  
       NSInteger index = [store integerForKey:@"selectedIndex"];          
       NSLog(@"用户已经设置的selectedIndex的值是:%d", index);  
    } else {          
       NSLog(@"请设置默认的值");         
    }  


一、NSUserDefaults数据存储的位置

   NSUserDefaults用于保存iPhone程序的数据,使用非常方便。
   那么这些数据最终存放在什么地方呢?存放于一个plist文件中。
   这个文件位于<UUID for your App>\Library\Preferences\<your App"s bundle ID>.plist

二、支持存取的数据类型
   NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.


三、取
   例如:

Objective-c代码   收藏代码
  1. //读取和保存用户使用软件次数  
  2.   
  3. NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];  
  4.   
  5. NSNumber* count = [ud objectForKey:@"times"];  


四、存

   接上例:
Objective-c代码   收藏代码
  1. int t = [count intValue]+1;  
  2.   
  3. [ud setObject:[NSNumber numberWithInt:t] forKey:@"times"]; 
三、取
   例如:

    //读取和保存用户使用软件次数  
      
    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];  
      
    NSNumber* count = [ud objectForKey:@"times"];  



四、存

   接上例:

int t = [count intValue]+1;  
  
[ud setObject:[NSNumber numberWithInt:t] forKey:@"times"];  


实例

-(id)init
{
    self=[super init];
    if (self) 
    {
        CCSprite *background=[[CCSprite alloc] initWithFile:@IMAGE_INC_LOGO]; ;
        [self addChild:background];
        //CGSize size = [[CCDirector sharedDirector] winSize];
        background.position=ccp(240,160);  //(size.width/2, size.height/2);
        [background release];
        [self performSelector:@selector(complete) withObject:self afterDelay:3.0];
        
        user = [NSUserDefaults standardUserDefaults];
        skip = [user integerForKey:@"can_skip"];      //第一次运行,不可以跳过
        
        if (skip != 0) 
        {
            self.isTouchEnabled = YES;
        }
        
        int k = [user integerForKey:@"run_once"]; 
        if (k == 0) 
        {
            [user setInteger:3 forKey:@"gold_feather_count"];
            [user setInteger:1 forKey:@"phoenix_count"];
            
            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
            [dateFormatter setDateFormat:@"yyyy-MM-dd"];  //yyyy-MM-dd HH:mm:ss  -- 2010-10-27 10:22:13
            NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]];
            [dateFormatter release];
            [user setObject:currentDateStr forKey:@"today"];  //加日期
            
            //不会再次运行了
            [user setInteger:1 forKey:@"run_once"];
        }
        
    }
    return self;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值