我在ViewDidLoad
方法
inputArray = [NSMutableArray arrayWithObjects:@"car", @"bus", @"helicopter", @"cruiz", @"bike", @"jeep", nil];
我有另一个UITextField
用于搜索元素。所以,当我在UITextField
中键入一些内容时,我想检查该字符串是否存在于“inputArray”中。如果它不匹配inputArray中的元素然后从inputArray中删除相应的元素。
for (NSString* item in inputArray)
{
if ([item rangeOfString:s].location == NSNotFound)
{
[inputArray removeObjectIdenticalTo:item];//--> Shows Exception
NSLog(@"Contains :%@",containsAnother);
}
}
但此代码显示异常,与“removeobject:”
相关例外:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSCFConstantString rangeOfString:options:range:locale:]: nil argument'
*** First throw call stack:
`
答案 0 :(得分:10)
在快速枚举中,您可以不修改集合。
枚举器对象变为常量且不可变。
如果要对阵列进行更新
你应该这样:
NSMutableArray *inputArray = [NSMutableArray arrayWithObjects:@"car", @"bus", @"helicopter", @"cruiz", @"bike", @"jeep", nil];
NSString *s=@"bus";
for (int i=inputArray.count-1; i>-1; i--) {
NSString *item = [inputArray objectAtIndex:i];
if ([item rangeOfString:s].location == NSNotFound) {
[inputArray removeObject:item];
}
}
编辑:
上述作品与此类似:
NSArray *array=[inputArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@",s]];
答案 1 :(得分:10)
您可以使用以下代码
for (int i=0;i<[inputArray count]; i++) {
NSString *item = [inputArray objectAtIndex:i];
if ([item rangeOfString:s].location == NSNotFound) {
[inputArray removeObject:item];
i--;
}
}
答案 2 :(得分:0)
那需要是NSMutableArray
。一旦创建,您就无法修改NSArray
(除了全部开始)。
改变这个:
inputArray = [NSArray arrayWithObjects:@"car", @"bus", @"helicopter", @"cruiz", @"bike", @"jeep", nil];
到此:
inputArray = [NSMutableArray arrayWithObjects:@"car", @"bus", @"helicopter", @"cruiz", @"bike", @"jeep", nil];
并且还将属性更改为NSMutableArray:
@property(nonatomic, strong) NSMutableArray *inputArray;
答案 3 :(得分:0)
你问题中的s
可能是零。所以你得到了例外。请检查一下。
答案 4 :(得分:0)
这是我喜欢使用的干净解决方案。您可以定义NSArray类别以对其进行扩展并创建 map 方法。此方法根据您在块中返回的内容创建新的NSArray:
@interface NSArray (BlockExtensions)
/*!
Invokes block once for each element of self, returning a new array containing the
values returned by the block.
*/
- (NSArray *)map:(id (^)(id obj))block;
@end
@implementation NSArray (BlockExtensions)
- (NSArray *)map:(id (^)(id obj))block
{
return [self mapWithOptions:0 usingBlock:^id(id obj, NSUInteger idx) {
return block(obj);
}];
}
- (NSArray *)mapWithOptions:(NSEnumerationOptions)options usingBlock:(id (^)(id obj, NSUInteger idx))block
{
NSMutableArray *array = [NSMutableArray arrayWithCapacity:[self count]];
[self enumerateObjectsWithOptions:options usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
id newobj = block? block(obj, idx) : obj;
if (newobj)
[array addObject:newobj];
}];
return array;
}
@end
对于原始数组中的每个项目,将调用一次该块,并将此对象作为参数传递:
NSArray *newArray = [inputArray map:^id(NSString *item) {
if ([item rangeOfString:s].location == NSNotFound) {
return item;
}
return nil;
}];
newArray
将包含已过滤的商品!
答案 5 :(得分:0)
使用以下代码。 (此代码用于基于UITextField
的输入字符串/文本的过滤器数组)
在NSMutableArray
方法中将两个ViewDidLoad
和一个数组添加到另一个数组,例如,
self.listOfTemArray = [[NSMutableArray alloc] init]; // array no - 1
self.ItemOfMainArray = [[NSMutableArray alloc] initWithObjects:@"YorArrayList", nil]; // array no - 2
[self.listOfTemArray addObjectsFromArray:self.ItemOfMainArray]; // add 2array to 1 array
并编写以下委托UISearchBar方法
- (BOOL) textFieldDidChange:(UITextField *)textField
{
NSString *name = @"";
NSString *firstLetter = @"";
if (self.listOfTemArray.count > 0)
[self.listOfTemArray removeAllObjects];
if ([searchText length] > 0)
{
for (int i = 0; i < [self.ItemOfMainArray count] ; i = i+1)
{
name = [self.ItemOfMainArray objectAtIndex:i];
if (name.length >= searchText.length)
{
firstLetter = [name substringWithRange:NSMakeRange(0, [searchText length])];
//NSLog(@"%@",firstLetter);
if( [firstLetter caseInsensitiveCompare:searchText] == NSOrderedSame )
{
// strings are equal except for possibly case
[self.listOfTemArray addObject: [self.ItemOfMainArray objectAtIndex:i]];
NSLog(@"=========> %@",self.listOfTemArray);
}
}
}
}
else
{
[self.listOfTemArray addObjectsFromArray:self.ItemOfMainArray ];
}
[self.tblView reloadData];
}
}
Console.
答案 6 :(得分:0)
正如其他人所说,在枚举时你不能改变数组。执行所需操作并保持快速枚举的便捷性的最简单方法是复制数组。
for (NSString* item in [inputArray copy]) {
...
}
答案 7 :(得分:0)
+1指向Anoop,指出您可以使用filteredArrayUsingPredicate
。因此,如果你想根据inputArray
中的匹配创建一个新数组,你也可以使用类似的东西:
NSArray *matchingArray = [inputArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF contains[c] %@", s]];
或者,假设inputArray
是NSMutableArray
,您只需使用以下一行过滤数组:
[inputArray filterUsingPredicate:[NSPredicate predicateWithFormat:@"SELF contains[c] %@", s]];
或者,如果你喜欢积木:
[inputArray filterUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
return ([evaluatedObject rangeOfString:s].location != NSNotFound);
}]];