Fork me on GitHub

NSUserDefaults保存应用中的数据

在界面中显示文本内容中写入UITextView的文本,如何保存?

可以使用NSUserDefaults:

NSUserDefaults *textData;

该实例实际上是NSDirectory,保存键值对。在使用中,首先检查是否有该键值对,如果有赋值给TextView的text属性。

- (void) initTextView{ 
    textData=[NSUserDefaults standardUserDefaults]; 
    
    textview=[[UITextView alloc] initWithFrame:CGRectMake(550, 140, 400, 300)]; 
    textview.backgroundColor = [UIColor colorWithWhite:0 alpha:0]; 
    textview.textColor = [UIColor blackColor]; 
    textview.font = [UIFont fontWithName:@"Arial" size:24]; 
    textview.editable = YES; 
    textview.scrollEnabled = YES; 
    textview.delegate=self; 
    if ([textData objectForKey:@"page12.text.data"]!=nil) { 
        textview.text=[textData objectForKey:@"page12.text.data"]; 
    } 
    [self addSubview:textview]; 
}

 

下面的问题是当编辑的时候何时开始保存输入TextView的文本数据。这需要使用iOS SDK通用的delegate机制。UITextView可以设置delegate,类型是UITextViewDelegate。可用于监控文本信息编辑的开始和结束,以及文字的改变,文字的选择等。

在这里实现了textViewDidChange方法,用于当文字改变后回调:

- (void)textViewDidChange:(UITextView *)textView{ 
    NSLog(@">>>>>>changed!"); 
    [textData setObject:textView.text forKey:@"page12.text.data"]; 
}

 

当然别忘记把delegate实现的实例设置给TextView:

textview.delegate=self;

 

 

 

使用 plist 存储应用程序设置的好处是 plist 文件可以用文本编辑器打开编辑,但麻烦的地方就是要写不少代码。而使用 NSData 配合自定义的结构来存储设置就非常简单了。

  GameState.h

  #import

  /** 游戏状态数据

  */

  struct GameStateData {

  int version; // 状态数据结构的版本

  BOOL isSoundsEnabled; // 是否允许音效

  };

  typedef struct GameStateData GameStateData;

  @interface GameState : NSObject {

  BOOL _isLoaded;

  GameStateData _data;

  }

  + (GameState *) sharedState;

  - (BOOL) synchronize;

  @end

  GameState.m

  #import "GameState.h"

  @implementation GameState

  static GameState *_sharedState = nil;

  + (GameState *) sharedState

  {

  if (!_sharedState) {

  _sharedState = [[GameState alloc] init];

  }

  return _sharedState;

  }

  - (id) init

  {

  self = [super init];

  if (self) {

  _isLoaded = NO;

  // 初始化设置

  memset(& _data, 0, sizeof(_data));

  _data.version = 1;

  }

  return self;

  }

  - (BOOL) synchronize

  {

  NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

  NSData *data = nil;

  if (_isLoaded) {

  // 写入设置到 defaults

  data = [NSData dataWithBytes:& _data length:sizeof(_data)];

  [prefs setValue:data forKey:@"gameState"];

  return [prefs synchronize];

  }

  // 从 defaults 读取设置

  data = [prefs dataForKey:@"gameState"];

  if (!data || [data length] != sizeof(_data)) return NO;

  [data getBytes:& _data length:sizeof(_data)];

  _isLoaded = YES;

  return YES;

  }

  @end

  使用说明:

  GameState.h 里面定义的 GameStateData 结构用来存储设置,可以随意扩充,但只能限于基本的 C 语言类型,不能是指针。如果需要存储字符串之类的,可以使用 char[xx] 数组,读取写入前稍微处理一下即可。

  应用程序初始化时,执行 [[GameState sharedState] synchronize]。

  设置改变后需要保存时,再次执行 [[GameState sharedState] synchronize]。

posted on 2012-02-10 11:47  pengyingh  阅读(1149)  评论(0)    收藏  举报

导航