数据持久化tableView问题iPhone(读写plist)
Posted
技术标签:
【中文标题】数据持久化tableView问题iPhone(读写plist)【英文标题】:Data persistance tableView issue iPhone(reading and writing to plist) 【发布时间】:2012-11-12 03:58:21 【问题描述】:在我的应用程序中,我想实现一个简单的警报功能。我知道如何使用 UILocalNotifications,但我遇到了这个源代码,它具有与 iPhone 的本地时钟应用程序警报区域类似的 UI,并且它具有一种类型的数据持久性。这个源代码有两件事我不擅长界面设计和数据持久性。但是我下载了它并开始使用它,发现警报不是持久的。
Download
有谁知道如何调整源代码以使其具有持久性并且可以保存和读取 plist?我也乐于学习,这个领域对我来说也有些陌生。谢谢
【问题讨论】:
【参考方案1】:我查看了您的代码并发现您没有将“Alarms.plist”文件表单资源移动到文档目录的问题。我们无法编辑资源文件夹中的文件。所以在应用委托文件中编写以下代码。
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *theFileName = @"Alarms.plist"; //Change this appropriately
NSString *oldPath = [[NSBundle mainBundle] pathForResource:@"Alarms" ofType:@"plist"];//[NSString stringWithFormat:@"%@/Inbox/%@", documentsDirectory, theFileName];
NSString *newPath = [NSString stringWithFormat:@"%@/%@", documentsDirectory, theFileName];
if (![[NSFileManager defaultManager] fileExistsAtPath:newPath])
[[NSFileManager defaultManager] moveItemAtPath:oldPath toPath:newPath error:nil];
对文档目录文件夹中的文件执行保存操作。
【讨论】:
我将代码添加到 applicationDidFinishLaunching 但仍然没有保存警报。但我注意到,即使应用程序启动时,它也会显示“无法读取 plist 文件:”,并且在我 NSLogged 之后甚至不会调用保存操作?我的 plist 本身有问题吗? @user1814207 在您的代码中,您从不调用 save 方法将数据写入文件,只需在数组中添加对象请调用 AlarmListController 的 save 方法,以便将您的对象添加到文件中。 好的,所以现在调用了 save 但是当我关闭应用程序并重新启动它时它会崩溃*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0xf527da0
我认为这一定与数组对其中有新部分感到困惑的事实有关tableView 但我相信我用- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section return [[self displayedObjects] count];
解决了这个问题
我在我的计算机上找到了 .app 构建文件,以查看新数据是否已保存到 plist 中,但事实并非如此。
这是崩溃日志的图片 - Image【参考方案2】:
试试这个代码...将 plist 从包保存到文档目录 请注意,您将在第一次应用启动时出现“无法读取...”
- (NSMutableArray *)displayedObjects
if (_displayedObjects == nil)
NSString *path = [[self class] pathForDocumentWithName:@"Alarms.plist"];
NSArray *alarmDicts = [NSMutableArray arrayWithContentsOfFile:path];
if (alarmDicts == nil)
NSLog(@"Unable to read plist file: %@", path);
NSLog(@"copy Alarms.plist to: %@", path);
NSString *pathToSetingbundle = [[NSBundle mainBundle] pathForResource:@"Alarms" ofType:@"plist"];
[[NSFileManager defaultManager]copyItemAtPath:pathToSetingbundle toPath:path error:nil];
_displayedObjects = [[NSMutableArray alloc]
initWithCapacity:[alarmDicts count]];
for (NSDictionary *currDict in alarmDicts)
Alarm *alarm = [[Alarm alloc] initWithDictionary:currDict];
[_displayedObjects addObject:alarm];
NSLog(@"@disply obj %@", alarm);
return _displayedObjects;
【讨论】:
感谢您的代码,但我认为我的应用程序的问题比我最初预期的要严重。 您的应用程序的问题现在是(我想).. 只是您如何保存数据。测试/修改您的“保存代码” - 检查您的 Alarms.plist(来自文档目录),直到它锁定为止 我想,你必须有.. 一个字典数组.. 这个“newArrayForPlist”必须保存以上是关于数据持久化tableView问题iPhone(读写plist)的主要内容,如果未能解决你的问题,请参考以下文章