首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试将.plist中的BOOL值存储到实现文件中的BOOL变量时崩溃

尝试将.plist中的BOOL值存储到实现文件中的BOOL变量时崩溃
EN

Stack Overflow用户
提问于 2011-12-14 06:25:53
回答 1查看 1.3K关注 0票数 1

我使用以下代码(MyAppTableViewController)在应用程序启动时创建了一个.plist:

代码语言:javascript
复制
NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *finalPath = [documentsDirectory stringByAppendingPathComponent:@"Settings.plist"];

BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:finalPath];

if (!fileExists) {
    NSLog(@"Creating file");
    NSDictionary *plistDict = [[NSDictionary alloc]initWithObjectsAndKeys:@"1",@"Fade out",@"1",@"Enable Gestures",@"1",@"Proximity Sensor",@"1",@"Keep screen ON",nil];
    NSString *error = nil;

    NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];

    if(plistDict) {
        [plistData writeToFile:finalPath atomically:YES];
    } else {
        NSLog(@"Error: %@", error);
        [error release];
    }
}

这可以很好地工作,并且文件是使用键和值创建的。然后,我有一个包含四个开关的表,其中的选择器是函数toggle:

-(void)toggle:(id)sender中的代码将开关的值与indexPath的行一起获取,并相应地修改plist:

代码语言:javascript
复制
-(void)toggle:(id)sender {
    UISwitch *aSwitch = (UISwitch *)sender;
    UITableViewCell *cell = (UITableViewCell *)aSwitch.superview;
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];    

    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *finalPath = [documentsDirectory stringByAppendingPathComponent:@"Settings.plist"];
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:finalPath];

    if (indexPath.section == 0 && indexPath.row == 0) {
        [dictionary setObject:[NSNumber numberWithBool:aSwitch.on] forKey:@"Fade out"];
    }
//There are further (similar) else if statements, but I'll leave them out.

    NSString *error = nil;
    NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:dictionary format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];

    if(dictionary) {
        [plistData writeToFile:finalPath atomically:YES];
    } else {
        NSLog(@"Error: %@", error);
        [error release];
    }
}

这也工作得很好,并且成功地修改了plist。当我尝试用以下代码检索数据时,我的问题就出现了:

代码语言:javascript
复制
NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *finalPath = [documentsDirectory stringByAppendingPathComponent:@"Settings.plist"];
NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:finalPath];

fadeOut = [[NSString stringWithFormat:[dictionary objectForKey:@"Fade out"]]boolValue];
proximitySensor = [[NSString stringWithFormat:[dictionary objectForKey:@"Proximity Sensor"]]boolValue];
enableGestures = [[NSString stringWithFormat:[dictionary objectForKey:@"Enable Gestures"]]boolValue];
keepScreenOn = [[NSString stringWithFormat:[dictionary objectForKey:@"Keep screen ON"]]boolValue];

在声明文件中,我定义了BOOL fadeOut,proximitySensor,enableGestures,keepScreenOn;。抓取信息运行良好,但当我更改BOOL值时,应用程序崩溃。我不太明白问题出在哪里。也许我错过了更大的图景,或者布尔值的一个简单但重要的错误。

如果我删除上面的代码,一切都会正常工作。但如果我把它放在那里,应用程序就会崩溃,并显示以下消息:

代码语言:javascript
复制
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFBoolean length]: unrecognized selector sent to instance 0x3f39a9f0'

非常感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-14 06:30:43

如果你看这条线

代码语言:javascript
复制
fadeOut = [[NSString stringWithFormat:[dictionary objectForKey:@"Fade out"]]boolValue]

您正在从NSNumber初始化一个字符串(您将您的BOOL存储在一个NSNumber中)。这本身就是无效的。

如果需要NSNumber的布尔值,只需对其使用boolValue即可。

代码语言:javascript
复制
fadeOut = [[dictionary objectForKey:@"Fade out"] boolValue];

这对于检索布尔值的所有时间都是正确的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8497086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档