gpt4 book ai didi

ios - 为什么我的 .plist 没有显示保存的数据?

转载 作者:行者123 更新时间:2023-11-29 03:01:49 25 4
gpt4 key购买 nike

我有一个简单的待办事项列表,我可以在列表中添加项目。我想在应用关闭时将这些项目保存到 .plist 文件中,以便在用户重新打开应用时显示它们。

我目前正在尝试两种不同的方法。两者都给我 List successfully saved! 日志条目,但都没有在重新启动时显示文件。

方法一:在我的 mainAppDelegate.m

- (void)applicationWillTerminate:(UIApplication *)application
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSString *filePath = [basePath stringByAppendingPathComponent:@"toDoItems.plist"];

NSMutableDictionary *plistdict = [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
[plistdict writeToFile:filePath atomically:YES];


if(![self.toDoItems writeToFile:filePath atomically:YES]) {
NSLog(@"List Successfully Saved!");
};
}

在我的 XYZToDoListController.m 中:

- (void)viewDidLoad
{
[super viewDidLoad];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"toDoItems.plist"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:filePath])

方法二:在我的 mainAppDelegate.m 中:

- (void)applicationWillTerminate:(UIApplication *)application
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"toDoItems.plist"];


if(![self.toDoItems writeToFile:filePath atomically:YES]) {
NSLog(@"List Successfully Saved!");
};
}

在我的 XYZToDoListViewController 中:

- (void)viewDidLoad
{
[super viewDidLoad];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"toDoItems.plist"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:filePath])
{
self.toDoItems = [[NSMutableArray alloc]initWithContentsOfFile:filePath];
NSLog(@"Loading saved list");
} else {
self.toDoItems = [[NSMutableArray alloc] init];
NSLog(@"Empty List");
}
}

我对使用 Objective C 还很陌生,我已经阅读了很多问题和答案,但我似乎无法加载我的 .plist 文件。有人可以通过一个适用于我的情况的很好的例子来帮助我找出我的代码中出了什么问题吗?

正如我所说,在日志输出中我看到“空列表”方法正在加载,它告诉我“列表已成功保存!”。除此之外的任何调试输出我都不确定如何使用。

谢谢

最佳答案

您将文件保存在 NSDocumentsDirectory 中(如果合适),但是当您加载它时,您只是从应用程序当前目录(可能是应用程序文件夹本身)加载它。您还在读取之前写入一个空文件,请尝试在应用程序委托(delegate)中使用以下内容:

-(NSString*)toDoFilePath
{
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSString *filePath = [basePath stringByAppendingPathComponent:@"toDoItems.plist"];

return filePath;
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
if ([[NSFileManager defaultManager] fileExistsAtPath:[self toDoFilePath]])
{
self.toDoItems = [[NSMutableArray alloc]initWithContentsOfFile:[self toDoFilePath]];
NSLog(@"Loading saved list");
} else {
self.toDoItems = [[NSMutableArray alloc] init];
NSLog(@"Empty List");
}

return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{
if([self.toDoItems writeToFile:[self toDoFilePath] atomically:YES]) {
NSLog(@"List Successfully Saved!");
};
}

假设(如图所示)您的应用程序委托(delegate)上已经有一个 toDoItems 属性。

要使用 View Controller 中的数据,在包含 AppDelegate.h 文件后,您可以使用:

self.toDoItems = [(AppDelegate*) [[UIApplication sharedApplication] delegate] toDoItems];

关于ios - 为什么我的 .plist 没有显示保存的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23206532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com