Search code examples
objective-carraysuitableviewcheckboxdidselectrowatindexpath

table removing index path row values from array


I'm trying to create an array from selected table rows so I can push it to a new view. My issue is deleting an unselected row from the array it throws an error of index beyond bounds, although I have other items selected.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//listOfItems is a Pre Populated Array for the table 
    NSString *cellValue = [listOfItems objectAtIndex:indexPath.row];     
//the array i want my selected items to be added to  
     NSArray *array = names;

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];



    if (cell.accessoryType == UITableViewCellAccessoryNone) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;

   [names addObject:cellValue];

        NSLog(@"ARRAY: %@", array);

    }
    else {
        cell.accessoryType = UITableViewCellAccessoryNone;

             [names removeObjectAtIndex:indexPath.row];        

         NSLog(@"ARRAY: %@", array);  
    }

    [tableView deselectRowAtIndexPath:indexPath animated:NO];


     } 
}

How do I find the index number in the array that is being created so it can delete the proper value? Any help would be appreciated :-) Thanks!

-----SOLUTION----- Here's an alternative way too just in case others were wondering.

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    NSString *selected = [listOfItems objectAtIndex:indexPath.row];

   if (cell.accessoryType == UITableViewCellAccessoryNone) {
      cell.accessoryType = UITableViewCellAccessoryCheckmark;

               [names addObject:selected];
             NSLog(@"ARRAY ADDED %@", names);
        }


   else {

        cell.accessoryType = UITableViewCellAccessoryNone;            

        [names removeObject:selected];   

        NSLog(@"ARRAY DELETED %@", names);

    }

Solution

  • If your intention is to pass an array of checked cell values to a view, why adding and removing objects at each cell selection? You could easily achieve this just before you're about to present the new view controller. Something like this:

    // In whatever method you have to present the new view controller
    // ...
    NSMutableArray *names = [[NSMutableArray alloc] initWithCapacity:0];
    
    for (int i = 0; i < listOfItems.count; i++)
    {
        if ([self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]].accessoryType == UITableViewCellAccessoryCheckmark) //Change section number if not 0
        {
            [names addObject:[listOfItems objectAtIndex:i]];
        }
    }
    
    // Pass the array now to the destination controller
    

    Ps. You still have to manage checking/unchecking of cells (just as you're already doing in the code above).