如何保存iPhone应用程序多个视图中的数据?

16 浏览
0 Comments

如何保存iPhone应用程序多个视图中的数据?

我正在制作一个应用程序,在应用程序退出时需要保存应用程序中多个视图中的文本。我还需要能够从这些视图中的一个视图中删除所有数据,而且当应用程序退出时,可能还没有创建所有这些视图。

阅读了这篇帖子后,我认为使用一个管理我的应用程序数据的单例可能是个不错的选择,它在首次请求数据时加载数据,并在应用程序退出时保存数据。然后,在每个需要保存数据的视图中,我可以直接在单例上设置它。

我尝试了一下,但遇到了一些问题。起初,我没有合成属性(就像我参考的帖子中一样),但编译器告诉我需要创建getter和setter,所以我就创建了。现在,当我的applicationWIllTerminate:被调用时,应用程序崩溃了,控制台显示"Program received signal: “EXC_BAD_ACCESS”. kill quit"。

有人能告诉我我做错了什么,或者提出更好的保存数据的方法吗?

//SavedData.h

#import 
#define kFileName @"appData.plist"
@interface SavedData : NSObject {
    NSString *information;
    NSString *name;
    NSString *email;
    NSString *phone;
    NSString *mobile;
}
@property(assign) NSString *information;
@property(assign) NSString *name;
@property(assign) NSString *email;
@property(assign) NSString *phone;
@property(assign) NSString *mobile;
+ (SavedData *)singleton;
+ (NSString *)dataFilePath;
+ (void)applicationWillTerminate:(NSNotification *)notification;
@end

//SavedData.m

#import "SavedData.h"
@implementation SavedData
@synthesize information;
@synthesize name;
@synthesize email;
@synthesize phone;
@synthesize mobile;
static SavedData * SavedData_Singleton = nil;
+ (SavedData *)singleton{
    if (nil == SavedData_Singleton){
        SavedData_Singleton = [[SavedData_Singleton alloc] init];
        NSString *filePath = [self dataFilePath];
        if([[NSFileManager defaultManager] fileExistsAtPath:filePath]){
            NSMutableArray * array = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
            information = [array objectAtIndex:0];
            name = [array objectAtIndex:1];
            email = [array objectAtIndex:2];
            phone = [array objectAtIndex:3];
            mobile = [array objectAtIndex:4];           
            [array release];
        }
        UIApplication *app = [UIApplication sharedApplication];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:app]; 
    }
    return SavedData_Singleton;
}
+ (NSString *)dataFilePath{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *DocumentsDirectory = [paths objectAtIndex:0];
    return [DocumentsDirectory stringByAppendingPathComponent:kFileName];
}
+ (void)applicationWillTerminate:(NSNotification *)notification{
    NSLog(@"Application will terminate received");
    NSMutableArray *array = [[NSMutableArray alloc] init];
    [array addObject:information];
    [array addObject:name];
    [array addObject:email];
    [array addObject:phone];
    [array addObject:mobile];
    [array writeToFile:[self dataFilePath] atomically:YES];
    [array release];
}
@end

然后当我想要使用它时,我这样做:

myLabel.text = [SavedData singleton].information;

当我更改字段时,我这样做:

[SavedData singleton].information = @"my string";

非常感谢任何帮助!

0
0 Comments

问题原因:属性应该使用retain而不是assign。

解决方法:使用单例模式来保存数据。可以参考提供的链接和示例代码来实现。

0