NSDictionary App崩溃

时间:2014-02-10 17:32:50

标签: ios objective-c sdk nsdictionary

尝试读取plist并根据在以下设置包中选择的选项更改我的字体颜色。 enter image description here

以下是我试图完成它的方法:

NSString *path = @"/var/mobile/Library/Preferences/NCNotes.plist";
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
fontSize = [[dict objectForKey:@"slideSwitched"] floatValue];

if ([[dict objectForKey:@"noteColor"] valueForKey:@"Purple"]) {
   noteView.textColor = [UIColor purpleColor];
} else {
    noteView.textColor = [UIColor blackColor];
}

为什么这就是我的应用程序崩溃的原因?如何读取值并根据所选内容更改颜色?

3 个答案:

答案 0 :(得分:1)

看来你的plist的顶层是一个数组,而不是字典,因为在顶部它表示"项目1"所有内容都在其中。所以你在一个数组中有一个字典。所以你可以改变你的代码:

NSString *path = @"/var/mobile/Library/Preferences/NCNotes.plist";
NSArray *array = [[NSArray alloc] initWithContentsOfFile:path];
NSDictionary *dict = array[0];

您还可以更改plist的结构,以便将字典作为根而不是数组。

此外,键应该在左侧,而它们的值在右侧,所以我没有看到键#34; noteColor"。你有一把钥匙"钥匙"使用值" noteColor",因此您需要进行更正。我也没有看到" slideSwitched"键,虽然它可能超出了你的截图范围。

以下工作也没有成功:

[[dict objectForKey:@"noteColor"] valueForKey:@"Purple"]

无论你从[dict objectForKey:@"noteColor"]得到什么都不会成为字典,所以打电话给valueForKey:就不会给你你想要的东西。

答案 1 :(得分:0)

只需使用文档目录

即可
 NSString *contentPath=[[NSBundle mainBundle] pathForResource:@"PLIST_FILE_NAME" ofType:@"plist"];
NSDictionary *dictionary=[NSDictionary dictionaryWithContentsOfFile:contentPath];

在此之后写下你的逻辑,等一下,它似乎也没有一个键“noteColor”。检查你的plist

答案 2 :(得分:0)

以下是wazoo记录的一些示例代码。希望它能帮助您理解这些词典和词典的工作原理。一切都将基于你的plist文件(这肯定可以改进,但由于我不了解你的具体情况,这取决于你)。

您的问题是"如何根据用户选择找到颜色?"我假设您将用户选择作为int。类似于"用户选择了7"。

//Load your plist dictionary
NSString *path = @"/var/mobile/Library/Preferences/NCNotes.plist";
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];

//Get the array of validValues and the array of validTitles
NSArray *valuesArray = [dict objectForKey:@"validValues"];
NSArray *titlesArray = [dict objectForKey:@"validTitles"];

//Now get the user selected index from the validValues array
int arraySelection = -1;
for(int i = 0; i < [valuesArray count]; i++)
{
    NSNumber *number = [valuesArray objectAtIndex:i];
    if([number intValue] == userSelectedInput)
    {
        arraySelection = i;
        break;
    }
}
if(arraySelection == -1)
{
    //Not found in array
    return;
}

//Now with that index get the title of the object that the user selected
NSString *userSelectedTitle = [titlesArray objectAtIndex:arraySelection];

//Now do your checking on what the user selected based on that:
if([userSelectedTitle isEqualToString:@"Purple"])

...

你可以把它煮得相当多。目前,您的validValues数组完全没用。如果它出现故障或缺少数字则需要,但可以通过validTitles数组实现直接计数。