博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NSUserDefaults保存应用中的数据
阅读量:7174 次
发布时间:2019-06-29

本文共 2600 字,大约阅读时间需要 8 分钟。

在中写入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]。

转载地址:http://xmfzm.baihongyu.com/

你可能感兴趣的文章
哪些因素导致Python运行效率低?python入门编程
查看>>
[Python]第一个爬虫练习
查看>>
提高Python代码效率的方法
查看>>
zabbix使用msmtp&&mutt搭建邮件告警服务
查看>>
USB抓包工具--Bus Hound的使用方法详解
查看>>
location of android sdk has not been setup in the preference
查看>>
Centos7 二进制安装mysql5.7
查看>>
Centos7之Nginx的两种工作模式
查看>>
Java之品优购课程讲义_day18(3)
查看>>
rpm,yum,权限
查看>>
更新yum到 163
查看>>
Office 2019 & Office 2016 下载地址
查看>>
tomcat应用转到weblogic上时的问题
查看>>
国外程序员是如何准备面试的
查看>>
Zookeeper监控之——node-zk-browser
查看>>
我的友情链接
查看>>
10个最酷的linux单行命令
查看>>
myeclipse 10 在mac retina 屏幕下显示字体模糊解决方法
查看>>
创建自定义的指令
查看>>
javascript对象中判断属性
查看>>