-[__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)
更改为NSArray
和NSMutableArray
,但它们不起作用。我还添加了这个:
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 就像我在问题中所述,_cloudItems
是NSMutableArray
。它正在从- (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:]: 无法识别的选择器发送到实例的主要内容,如果未能解决你的问题,请参考以下文章