阅读和写作plist(iPhone编程)

时间:2010-11-17 21:09:51

标签: ios objective-c iphone persistence plist

我正在尝试从“Beginning iPhone 3开发手册”中实现一个简单的plist示例。我查看了代码,但我的数据从未保存到plist文件中。实际上我的项目站点地图如下:每当你启动应用程序时,它都会在TestViewController中触发。在TestViewController上,有一个按钮。单击按钮时,它会推送另一个视图控制器,即PersistenceViewController,这是我在PersistenceViewController中编写的代码。我怀疑:是否在此方法中调用了applicationWillTerminate?我不这么认为。请帮忙。我正在学习如何持久保存数据。

In .h file #define kFilename @"data2.plist"

 - (NSString *)dataFilePath {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *path = [documentsDirectory stringByAppendingPathComponent:kFilename];
        return path;
    }

    - (void)applicationWillTerminate:(NSNotification *)notification {
        NSMutableArray *contactFormArray = [[NSMutableArray alloc] init];
        NSLog(@"App Terminate:%d",[contactFormArray count]);
        [contactFormArray addObject:nameField.text];
        [contactFormArray addObject:emailField.text];
        [contactFormArray addObject:phoneField.text];
        [contactFormArray addObject:companyField.text];
        [contactFormArray writeToFile:[self dataFilePath] atomically:YES];
        [contactFormArray release];
    }


    // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
    - (void)viewDidLoad {

        NSString *filePath = [self dataFilePath];
        if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
            NSArray *contactFormArray = [[NSArray alloc] initWithContentsOfFile:filePath];
            NSLog(@"Did Load:%d",[contactFormArray count]);
            nameField.text = [contactFormArray objectAtIndex:0];
            emailField.text = [contactFormArray objectAtIndex:1];
            phoneField.text = [contactFormArray objectAtIndex:2];
            companyField.text = [contactFormArray objectAtIndex:3];
            [contactFormArray release];
        }

        UIApplication *app = [UIApplication sharedApplication];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:)name:UIApplicationWillTerminateNotification object:app];
        [super viewDidLoad];

    }

感谢任何有价值的建议......

3 个答案:

答案 0 :(得分:4)

当用户退出应用程序时(通常按Home按钮),将调用

applicationWillTerminate。将执行此委托方法中的任何代码(如果不花费太多时间)。在您的情况下,将保存Plist文件。

如果您使用的是iOS 4,按主页按钮可能会将您的应用程序发送到后台(不会退出)。如果使用调试器或崩溃杀死了应用程序,则不会调用该方法。

其他信息:

在iOS 4上,默认情况下在Xcode项目中启用了多任务处理。这可以防止调用applicationWillTerminate方法。如果您不想支持多任务处理,请将UIApplicationExitsOnSuspend放在MyAppName-Info.plist文件中并选中复选框。如果您确实想要支持它,请在应用程序进入非活动状态之前将任何代码放在要执行的applicationDidEnterBackground委托方法中。

答案 1 :(得分:2)

applicationWillTerminate:如果应用程序暂停,然后通过多任务UI杀死,则不会在多任务设备(iOS4)上调用。根据Apple的说法:“应用程序不知道任何过渡到停止状态的情况”。因此,如果你在applicationWillTerminate中保存任何内容:尝试在applicationWillResignActive中执行:。

答案 2 :(得分:0)

我可能会在这里弄错,但是不能将applicationWillTerminate编码到应用程序的delegate.m文件中,而不是在其他.m文件中?无论如何,由于iOS 4中的应用程序暂停状态,这可能无关紧要。