Search code examples
iosobjective-cnsdictionarynspredicateuisearchdisplaycontroller

Getting an NSDictionary by filtering another NSDictionary


Hope someone could help me with that :

I'm using a NSDictionary to fill a UITableView. Its model is like [key:userID => value:userName]. The tableView is only filled with userName but when clicked, it has to send the userID related. The problem comes when I want to filter the UITable. I only found the way to filter a Dictionary by transforming it into NSArray (using Predicate) but it make me loose the relation between userNames and userIDs.

A solution would be to filter the initial NSDictionary to get a filtered NSDictionary (with still the relational key/value), but I don't know how to do that. I only found solutions to get Arrays.

How could I do that, or is there a better solution to do it?


Solution

  • There is a much better solution, François. Create, from your NSDictionary (I will call it here myDictionary), an NSArray like this (declare it in your interface file):

    NSArray *arrayForTableView;
    

    Then, just after you load your NSDictionary, do the following:

    arrayForTableView = [myDictionary allKeys]; // so you will have an array of all UserID's
    

    Now, in your tableView: cellForRowAtIndexPath: method, you can do it like this:

    cell.textLabel.text = [myDictionary objectForKey:[arraForTableView objectAtIndex:indexPath.row]];
    

    And then, when you will want to pass the userID when the user selects the cell, in your tableView: didSelectRowAtIndexPath: you just do it this way:

    id userIDSelected = [arraForTableView objectAtIndex:indexPath.row];
    

    Then, when you want to filter the array according to the search, you can simply recreate your arrayForTableView, by "scanning" your NSDictionary this way:

    NSString *typedString;
    NSMutableArray *arrayFiltered = [NSMutableArray array];
    for (int i = 0; i < [[myDictionary allKeys] count]; i++)
    {
        if ([[myDictionary objectForKey:[[myDictionary allKeys] objectAtIndex:i]] rangeOfString:typedString].location != NSNotFound)
        {
            [arrayFiltered addObject:[[myDictionary allKeys] objectAtIndex:i]];
        }
    }
    
    arrayForTableView = arrayFiltered;
    

    This way, you won't even need to change your UITableView dataSource and delegate methods.