Ted
Ted

Reputation: 3885

remove object from NSMutableArray

I have two elements:

NSMutableArray* mruItems;
NSArray* mruSearchItems;

I have a UITableView that holds the mruSearchItems basically, and once the user swipes and deletes a specific row, I need to find ALL matches of that string inside the mruItems and remove them from there.

I haven't used NSMutableArray enough and my code gives me errors for some reason:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
    //add code here for when you hit delete
    NSInteger i;
    i=0;
    for (id element in self.mruItems) {
        if ([(NSString *)element isEqualToString:[self.mruSearchItems objectAtIndex:indexPath.row]]) {

            [self.mruItems removeObjectAtIndex:i];
        }
        else
           {
            i++;
           }
    }
    [self.searchTableView reloadData];

}    

}

Error: I see now that some of the strings are not between quotation marks (the ones in UTF8 are though)

Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x1a10e0> was mutated while being enumerated.(
    "\U05de\U05e7\U05dc\U05d3\U05ea",
    "\U05de\U05d7\U05e9\U05d1\U05d5\U05df",
    "\U05db\U05d5\U05e0\U05df",
    "\U05d1 ",
    "\U05d1 ",
    "\U05d1 ",
    "\U05d1 ",
    Jack,
    Beans,
    Cigarettes
)'

Upvotes: 3

Views: 6683

Answers (2)

Nikolai Ruhe
Nikolai Ruhe

Reputation: 81878

You get an exception because you are mutating a container while iterating over its elements.

removeObject: does exactly what you're looking for: removing all objects that are equal to the argument.

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle != UITableViewCellEditingStyleDelete)
        return;

    NSString *searchString = [self.mruSearchItems objectAtIndex:indexPath.row];
    [self.mruItems removeObject:searchString];
    [self.searchTableView reloadData];
}

Upvotes: 6

Stefan H
Stefan H

Reputation: 6683

You cannot edit the collection while enumerating through it, instead, store the indexes away, and then remove them afterwards by looping through your array of indexes.

Upvotes: 4

Related Questions