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