Ios 如何在具有字典的数组中查找IndexOfoObject
这是我的阵列:Ios 如何在具有字典的数组中查找IndexOfoObject,ios,objective-c,nsmutablearray,Ios,Objective C,Nsmutablearray,这是我的阵列: <__NSCFArray 0x7b6ca390>( { name = kumar; no = 158; }, { name = rajdeep; no = 338; }, { name = smitha; no = 361; }, { name = uma; no = 422; } ) 在哪里 _txtfield.text = @"rajdeep" 我得到一些随机垃圾值,比如2147483647,存储
<__NSCFArray 0x7b6ca390>(
{
name = kumar;
no = 158;
},
{
name = rajdeep;
no = 338;
},
{
name = smitha;
no = 361;
},
{
name = uma;
no = 422;
}
)
在哪里
_txtfield.text = @"rajdeep"
我得到一些随机垃圾值,比如2147483647,存储在selectedIndexPath中。
我错过什么了吗?或者有其他方法来处理它吗?此“垃圾值”似乎是NSNotFound
,使用此方法时应进行检查。长话短说,数组不包含要查找的值。它不起作用,因为您正在查找字符串,但数组包含字典,因此您可能需要搜索例如{“name”:“rajdeep”,“no”:@338}
或者,要使此操作仅适用于字符串,请使用NSPredicate
进行筛选,例如:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", valueFromTextbox];
NSArray result = [array filteredArrayUsingPredicate: predicate];
如果你的数组很短,你也可以做一个循环进行比较
更新要获取索引,请使用谓词的结果作为输入,例如
NSInteger selectedIndexpath = [self.arrLoadCell indexOfObject:result.firstObject];
这是因为数组包含字典,而不是字符串。无法将字符串(textfield.text)与数组中的字典进行比较。indexOfObject:需要存储在数组中的实际对象。您只为其中一个字典提供键的值 实现所需的方法之一是循环遍历数组,并针对每个字典测试值
您得到的“垃圾值”是NSNotFound,这意味着找不到该对象。我想您想要的是:
int idx = NSNotFound;
for (int i=0; i<self.arrLoadCell.count; i++) {
NSDictionary *dict = [self.arrLoadCell objectAtIndex:i];
if ([[dict objectForKey:@"name"] isEqualToString:_txtfield.text]) {
idx = i;
break;
}
}
NSInteger selectedIndexpath=idx;
int idx=NSNotFound;
对于(int i=0;i
假设您的字典数组是arrLoadCell,这应该可以工作。
这是调试器输出吗?@SebastianDressler是的。但在这种情况下它是。检查第二个索引中的字典,它确实有字符串,但您的搜索方法永远找不到该条目,请参阅我编辑的答案。谢谢@Sebastian。我检查了您的回复,数组结果中有我正在搜索的字典,但我希望字典的索引位于主数组中。我尝试了NSInteger selectedIndexpath=[self.arrLoadCell indexOfObject:result];
它仍然返回相同的垃圾数据,还是我只能比较indexOfObject:
方法中的字符串?但是当我选中NSArray.h文件时,该方法接受id-(NSUInteger)indexOfObject:(id)anObject;
很抱歉,我错过了,现在更新了答案以包含这条信息。哦,好的,谢谢。是的,有道理。那么我该如何继续?我的意思是,在不循环或遍历数组的情况下,我能做些什么?
int idx = NSNotFound;
for (int i=0; i<self.arrLoadCell.count; i++) {
NSDictionary *dict = [self.arrLoadCell objectAtIndex:i];
if ([[dict objectForKey:@"name"] isEqualToString:_txtfield.text]) {
idx = i;
break;
}
}
NSInteger selectedIndexpath=idx;
NSUInteger indexPath = 0;
for (NSDictionary *dic in arrLoadCell){
if ([[dic objectForKey:@"name"] isEqualToString: _txtfield.text]) {
indexPath=[arrLoadCell indexOfObject:dic];
break;
}
}
NSLog(@"%lu is the indexPATH",(unsigned long)indexPath);