我正在尝试从“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];
}
感谢任何有价值的建议......
答案 0 :(得分:4)
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中的应用程序暂停状态,这可能无关紧要。