从NSMutableArray中删除对象?

时间:2013-04-15 13:05:49

标签: ios objective-c search nsstring nsmutablearray

我在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:
`

8 个答案:

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

或者,假设inputArrayNSMutableArray,您只需使用以下一行过滤数组:

[inputArray filterUsingPredicate:[NSPredicate predicateWithFormat:@"SELF contains[c] %@", s]];

或者,如果你喜欢积木:

[inputArray filterUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    return ([evaluatedObject rangeOfString:s].location != NSNotFound);
}]];