【问题标题】:Data persistance tableView issue iPhone(reading and writing to plist)数据持久化tableView问题iPhone(读写plist)
【发布时间】:2012-11-12 03:58:21
【问题描述】:

在我的应用程序中,我想实现一个简单的警报功能。我知道如何使用 UILocalNotifications,但我遇到了这个源代码,它具有与 iPhone 的本地时钟应用程序警报区域类似的 UI,并且它具有一种类型的数据持久性。这个源代码有两件事我不擅长界面设计和数据持久性。但是我下载了它并开始使用它,发现警报不是持久的。

Download

有谁知道如何调整源代码以使其具有持久性并且可以保存和读取 plist?我也乐于学习,这个领域对我来说也有些陌生。谢谢

【问题讨论】:

    标签: iphone ios core-data plist tableview


    【解决方案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”必须保存
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多