Ios -[[uuu\nsu]字符串:选项:]:发送到实例的选择器无法识别

Ios -[[uuu\nsu]字符串:选项:]:发送到实例的选择器无法识别,ios,objective-c,json,uitableview,uisearchbar,Ios,Objective C,Json,Uitableview,Uisearchbar,我在UITableView中有一个UISearchBar,当点击它并开始键入时,它将自动更新列表。我有一个名为\u cloudItems的NSMutableArray,它返回一个JSON(我使用它来检索JSON字符串) 项目中的大多数代码都很好,除了这段给我带来此错误的代码:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\uu NSDictionaryI rangeOfString:options:::::]:未识别的选择器发送到实例0x17

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

项目中的大多数代码都很好,除了这段给我带来此错误的代码:
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\uu NSDictionaryI rangeOfString:options:::::]:未识别的选择器发送到实例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) {
注意:
\u cloudItems
是一个
NSMutableArray
并从以下代码块获取其代码:

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

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

}
我已尝试将(NSString*name in _cloudItems){的
更改为
NSArray
NSMutableArray
,但它们不起作用。我还添加了以下内容:

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

for (NSString *name in dictItem) {
但出现以下错误消息:

使用未声明的标识符'indepath';您的意思是'nsindepath'?


我做错了什么?非常感谢您的帮助。谢谢。

也许您在_clouditems中的一个名字不是[NSString],是[NSDictionary],并且[NSDictionary]没有响应rangeOfString:options:.在句子上设置断点,这样您就可以检查name变量。

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

可能您在_clouditems中的一个名称不是[NSString],而是[NSDictionary]和[NSDictionary]不响应RangeOfsString:options:。在句子上设置断点,以便可以检查name变量。

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

尝试此操作

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];

    }
}
试试这个

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];

    }
}
试试这个

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];

    }
}
试试这个

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];

    }
}



nameRange
从何而来?\u cloudItems中的对象是NSString还是NSDictionary?@正如我在问题中所述,
\u cloudItems
是一个
NSMutableArray
数组。它从
-(void)itemsRecieved:(NSArray*)items for request:(NSString*)connectionId{
NSDictionary*dictionary=[\u cloudItems objectAtIndex:indexath.row];而for(在[u cloudItems中的NSString*name)则是完全不同的dictionary*dictItem=[\u cloudItems objectAtIndex:indexath.row];表示_cloudItems中的对象是NSDictionary,而后者表示NSString…其中
nameRange
来自何处?表示_cloudItems中的对象是NSString还是NSDictionary?@正如我在问题中所述,
\u cloudItems
是一个
NSMutableArray
。它正在从
-(void)Items接收其信息(NSArray*)请求项:(NSString*)连接ID{
NSDictionary*DictionItem=[\u cloudItems objectAtIndex:Indexath.row];和for(NSString*name in _cloudItems)的dictionary*DictionItem=[\u cloudItems objectAtIndex:Indexath.row]非常不同;表示_cloudItems中的对象是NSDictionary,而后者表示NSString…其中
nameRange
来自何处?表示_cloudItems中的对象是NSString还是NSDictionary?@正如我在问题中所述,
\u cloudItems
是一个
NSMutableArray
。它正在从
-(void)Items接收其信息(NSArray*)请求项:(NSString*)连接ID{
NSDictionary*DictionItem=[\u cloudItems objectAtIndex:Indexath.row];和for(NSString*name in _cloudItems)的dictionary*DictionItem=[\u cloudItems objectAtIndex:Indexath.row]非常不同;表示_cloudItems中的对象是NSDictionary,而后者表示NSString…其中
nameRange
来自何处?表示_cloudItems中的对象是NSString还是NSDictionary?@正如我在问题中所述,
\u cloudItems
是一个
NSMutableArray
。它正在从
-(void)Items接收其信息(NSArray*)请求项:(NSString*)连接ID{
NSDictionary*DictionItem=[\u cloudItems objectAtIndex:Indexath.row];和for(NSString*name in _cloudItems)的dictionary*DictionItem=[\u cloudItems objectAtIndex:Indexath.row]非常不同;表示_cloudItems中的对象是NSDictionary,而后者表示NSString…不可能,这是问题所在。不可能,这是问题所在。不可能,这是问题所在。不可能,这是问题所在。@Junior117表示_cloudItems中的所有对象都是NSDictionary有没有办法在使用eac时将其转换为
NSArray
h项在适当的tableview单元格中?@Junior117您应该知道您的NSArray结构,然后使用它。检查我的更新答案。您应该了解NSArrayOk中的NSDictionary。它现在可以工作了。谢谢您,我非常感谢