使用 objectForKey 返回错误类型的键

Posted

技术标签:

【中文标题】使用 objectForKey 返回错误类型的键【英文标题】:Use objectForKey return wrong type of key 【发布时间】:2010-11-10 11:13:00 【问题描述】: 我正在从 NSDictionary 数组的文件中读取数据。每个 NSDictionary 都包含一个名为“EnglishName”的键,一个值为 NSString 类型的值。我得到一个 NSDictionary 的值,用初始化函数创建新的 ViewController,比如:initWithName:[(NSDictionary*)oneObjectInArray objectForKey:@"EnglishName"];然后使用 NavigationController 推送它。 第一次推送->没问题。然后按回然后再做一次(单击以创建新的 ViewController 并推送)出现错误并通知:[__NSArrayM rangeOfString:]: unrecognized selector sent to instance 0x63509a0'。 -我通过添加命令 NSLog(@"%@", [object getObjectForKey:@"EnglishName"])->error 进行了检查。 然后我尝试在 didShowView 函数中再次读取数据(返回后)。它可以正常工作。

这是从文件中获取数据的代码。太长但可能有助于解决这个问题`- (void) getListStoriesAvailable [_header removeAllObjects]; SAFE_RELEASE(saveDataFromDataFile) [storiesAvailableArray removeAllObjects]; NSString * 数字 = @"0123456789"; NSString * ALPHA = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ";

for (int i = 0; i < 27; i++) 

    NSMutableArray * element = [[NSMutableArray alloc] init];
    [storiesAvailableArray addObject:element];
    [element release];

NSString * path = [NSString stringWithFormat: @"%@/data.ini",documentDirectory];
if ([[NSFileManager defaultManager] fileExistsAtPath:path]) 

    saveDataFromDataFile = [[NSMutableArray alloc] initWithContentsOfFile:path];
    for (int i = 0; i < [saveDataFromDataFile count]; i++)
        [[saveDataFromDataFile objectAtIndex:i] setObject:@"NO" forKey:@"Downloading"];
    for (int  i = 0; i < [saveDataFromDataFile count]; i++)
    
        NSDictionary * theStory = [saveDataFromDataFile objectAtIndex:i];       
        NSString * word = [theStory objectForKey:@"EnglishName"];
        if ([word length] == 0) continue;

        NSString * firstCharacter = [[word substringToIndex: 1] uppercaseString];

        NSRange range;
        //The special case when the name of story start with a digit, add the story into "0-9" header and index
        range = [digit rangeOfString:firstCharacter];
        if (range.location != NSNotFound) 
        
            [[storiesAvailableArray objectAtIndex:0] addObject:theStory];
            continue;
        
        //Check the index of the first character
        range = [ALPHA rangeOfString:firstCharacter];
        if (range.location != NSNotFound) 
        
            [[storiesAvailableArray objectAtIndex:(range.location + 1)] addObject:theStory];
            continue;
        
    

NSMutableArray * temp = [[NSMutableArray alloc] init];
for (int i = 0; i < [storiesAvailableArray count]; i++)

    if ([[storiesAvailableArray objectAtIndex:i] count] != 0)
    
        [_header addObject:[ALPHA_ARRAY objectAtIndex:i]];
        [temp addObject:[storiesAvailableArray objectAtIndex:i]];
    

[storiesAvailableArray removeAllObjects];
for (int i = 0; i < [temp count]; i++)
    [storiesAvailableArray addObject:[temp objectAtIndex:i]];
//storiesAvailableArray = temp;
[temp release];

`

还有获取NSDictionary的代码

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

当前表 = 表视图; [tableView deselectRowAtIndexPath:indexPath 动画:YES]; NSInteger 行 = [indexPath 行]; NSDictionary * 故事; if (tableView == listStoriesAvailable) story = [[storiesAvailableArray objectAtIndex:[indexPath section]] objectAtIndex:row];

_storyDetail = [[StoryViewController alloc] initWithName:[story objectForKey:@"EnglishName"]];
[self.navigationController setDelegate:self];
[self.navigationController pushViewController:_storyDetail animated:YES];

那么问题是什么?请帮忙!

【问题讨论】:

【参考方案1】:

你没有保留你的字典。

请编辑您的问题并添加创建您的 NSDictionary 的代码。

【讨论】:

我通过 [[NSArray alloc] initWithContentOfFile] 读取了一个 NSDictionary 数组。之后每次,我通过 [array objectAtIndex :pos] 得到 NSDictionary 然后按照我的描述做一些事情 您肯定在某处丢失了字典,但您的代码看起来不错 - 我认为我们确实需要代码来提供帮助;你能在一个更小的测试应用中重现这个问题,以便我们能看到更多吗? 在你的视图控制器的 dealloc 方法中你释放你的字典 - 你不应该因为[array objectAtIndex:pos]没有为你保留它

以上是关于使用 objectForKey 返回错误类型的键的主要内容,如果未能解决你的问题,请参考以下文章

无法将返回的 objectForKey 作为 NSString

NSDictionary objectForKey 随机回答

NSDictionary objectForKey 返回值

objectForKey 不返回任何东西

“任何”的值类型没有成员 'objectforKey' Swift 3 转换

将 JSON 嵌套到核心数据和 ObjectForKey 错误