NSMutableDictionary对如何使用某些代码的密钥感到困惑?

时间:2011-01-14 14:24:47

标签: iphone xcode nsdictionary nsmutabledictionary

我从数据库中获取数据,我需要添加字符串字段值和记录ID。

但是,我需要使用它来处理一些现有的代码......

我正在替换它(请参阅下面的代码)并从我的数据库中获取数据。

NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
self.allCategories = dict;
[dict release];

这是它加载的文件......

alt text

但需要使用这些键和值搜索功能。

- (void)resetSearch {
NSMutableDictionary *allCategoriesCopy = [self.allCategories mutableDeepCopy];
self.Categories = allCategoriesCopy;
[allCategoriesCopy release];
NSMutableArray *keyArray = [[NSMutableArray alloc] init];
[keyArray addObject:UITableViewIndexSearch];
[keyArray addObjectsFromArray:[[self.allCategories allKeys] 
                           sortedArrayUsingSelector:@selector(compare:)]];
self.keys = keyArray;
[keyArray release];
}

- (void)handleSearchForTerm:(NSString *)searchTerm {
NSMutableArray *sectionsToRemove = [[NSMutableArray alloc] init];
[self resetSearch];

for (NSString *key in self.keys) {
    NSMutableArray *array = [Categories valueForKey:key];
    NSMutableArray *toRemove = [[NSMutableArray alloc] init];
    for (NSString *name in array) {
        if ([name rangeOfString:searchTerm 
                        options:NSCaseInsensitiveSearch].location 
                                                        == NSNotFound)
            [toRemove addObject:name];
    }

    if ([array count] == [toRemove count])
        [sectionsToRemove addObject:key];

    [array removeObjectsInArray:toRemove];
    [toRemove release];
}
[self.keys removeObjectsInArray:sectionsToRemove];
[sectionsToRemove release];
[table reloadData];
}

继续从此代码中收到错误...

NSDictionary *arrayTmp= [[NSDictionary alloc] init];

... loop records

int cid = sqlite3_column_int(statementTMP, 0);
NSString *category = [[NSString alloc] 
   initWithUTF8String:(char *)sqlite3_column_text(statementTMP, 1)];

[arrayTmp setObject:category forKey:[NSString stringWithFormat:@"%i", cid]];

由上面一行引起的错误

*由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [NSCFString count]:无法识别的选择器发送到实例0x4d4c500'*第一次调用时调用堆栈*

... end loop

self.allCategories = arrayTmp;
[arrayTmp release];

3 个答案:

答案 0 :(得分:0)

  • setValue是键值编码方法。您应该使用setObject:forKey:代替。
  • arrayTmp应该加入[[NSMutableDictionary alloc] init]

答案 1 :(得分:0)

首先,你使用了错误的方法:

[arrayTmp setValue:category forKey:[NSString stringWithFormat:@"%i", cid]];

用于键值编码的方法(您可以找到有关KVO here的更多信息)。

您正在寻找的方法是:

[arrayTmp setObject:category forKey:[NSString stringWithFormat:@"%i", cid]];

而且,你应该是NSMutableDictionary。您使用的NSDictionary不支持变异。 (您可以在NSMutableDictionary here上找到更多信息。)

干杯, 的Pawel

答案 2 :(得分:0)

错误消息显示您正在向NSString的实例发送'count'。

我的猜测是'path'(plist文件)中的plist有一个字符串作为其中一个值。当您遍历'Categories'时,您希望每个值都是一个数组(即'NSMutableArray * array = [Categories valueForKey:key];')并将该值发送为'count'消息。

您希望成为数组的对象之一是字符串。