-[__NSDictionaryI rangeOfString:options:]: 无法识别的选择器发送到实例

Posted

技术标签:

【中文标题】-[__NSDictionaryI rangeOfString:options:]: 无法识别的选择器发送到实例【英文标题】:-[__NSDictionaryI rangeOfString:options:]: unrecognized selector sent to instance 【发布时间】:2013-11-28 01:57:29 【问题描述】:

我在UITableView 中有一个UISearchBar,当您点击它并开始输入时,它会自动更新列表。我有一个名为 _cloudItems 的 NSMutableArray,它返回一个 JSON(我使用 JJCloudEngine 来检索 JSON 字符串)。

项目中的大部分代码都很好,预计这段代码会给我这个错误:Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryI rangeOfString:options:]: unrecognized selector sent to instance 0x17e343e0'

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 

    if (searchText.length == 0) 
        // Set bollean flag
        isFiltered = NO;
     else 
        // Set boolean flag
        isFiltered = YES;

        // Alloc and init our fliteredData
        filteredList = [[NSMutableArray alloc] init];

        // Fast enumeration
        for (NSString *name in _cloudItems) 
            NSRange nameRange = [name rangeOfString:searchText options:NSCaseInsensitiveSearch];
            if (nameRange.location != NSNotFound) 
                [filteredList addObject:name];

            
        
    
    // Reload tableView
    [table reloadData];


我知道这两行代码是问题的原因:

for (NSString *name in _cloudItems) 
                if (nameRange.location != NSNotFound) 

注意:_cloudItems 是一个 NSMutableArray,并从此代码块中获取它的代码:

- (void)itemsRecieved:(NSArray *)items forRequest:(NSString *)connectionId 

    NSLog(@"cloud engine recieved items on request %@", connectionId);
    _cloudItems = items;
    [table reloadData];


我尝试将for (NSString *name in _cloudItems) 更改为NSArrayNSMutableArray,但它们不起作用。我还添加了这个:

NSDictionary *dictItem = [_cloudItems objectAtIndex:indexPath.row];

for (NSString *name in dictItem) 

但是会出现这个错误信息:

Use of undeclared identifier 'indexPath'; did you mean 'NSIndexPath'?

我做错了什么?任何帮助表示赞赏。谢谢。

【问题讨论】:

nameRange 来自哪里? _cloudItems中的对象是NSString还是NSDictionary? @Chancy 就像我在问题中所述,_cloudItemsNSMutableArray。它正在从- (void)itemsRecieved:(NSArray *)items forRequest:(NSString *)connectionId 接收信息 NSDictionary *dictItem = [_cloudItems objectAtIndex:indexPath.row];而 for (NSString *name in _cloudItems) 则完全不同 NSDictionary *dictItem = [_cloudItems objectAtIndex:indexPath.row];表示 _cloudItems 中的对象是 NSDictionary,而后者的意思是 NSString... 【参考方案1】:

试试这个

for (id name in _cloudItems) 
        if([name isKindOfClass:[NSString class]])
            NSRange nameRange = [(NSString *)name rangeOfString:searchText options:NSCaseInsensitiveSearch];
            if (nameRange.location != NSNotFound) 
                [filteredList addObject:name];

            
        
    

您应该确认名称是NSString,然后使用rangOfString。数组中的某个对象是NSDictionary。如果所有对象都是NSDictionary,您可能需要以下内容:

for (NSDictionary *item in _cloudItems) 

    NSString *name = [item objectForKey:@"somekey"];
    NSRange nameRange = [name rangeOfString:searchText options:NSCaseInsensitiveSearch];
    if (nameRange.location != NSNotFound) 
        [filteredList addObject:name];

    

【讨论】:

@Junior117 这意味着 _cloudItems 中的所有对象都是 NSDictionary 有没有办法把它变成NSArray,同时将每个项目都放在适当的表格视图单元格中? @Junior117 你应该知道你的 NSArray 结构然后使用它。检查我更新的答案。你应该对 NSArray 中的 NSDictionary 有所了解 好的。现在可以了。谢谢你,我非常感谢你必须经历的所有麻烦。【参考方案2】:

也许您在 _clouditems 中的一个名字不是 [NSString],是 [NSDictionary],并且 [NSDictionary] 不响应 rangeOfString:options: 。在句子上设置断点,以便检查名称变量。

【讨论】:

不是,这就是问题所在。

以上是关于-[__NSDictionaryI rangeOfString:options:]: 无法识别的选择器发送到实例的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式用于一系列数字和一个用于验证的字符