views:

34

answers:

1

Hey All, My iPhone application has a UITable View implemented with search functionality in it. The values in the table are grouped into sections from A-Z. Whenever a user tap on particular cell in the table it loads a detail view controller which gives all the values of that particular user. Now my problem is whenever I search some contact and tap on a particular user to check his detail view it always returns a contact starting with letter A. So, my doubt is how to implement this search functionality. Is there a way to get the name of the contact I tapped..Please check this screenshot.. For example if I search some contact starting with letter 'B' and tap on that contact it loads the detail view of a contact starting with letter 'A'. I get all the values from the database. Can you please help me out... alt text

This is the code:

The code I wrote here is in a method:

I am getting all the contacts from database and assigning to an array contacts. Then I am grouping all the contacts according to the alphabets and grouping everything into a dictionary with keys as A-Z and values as name of contacts starting with these letters. Now when I search for a particular contact his name may start with either A ,B or Z..so in the search bar when I search for a particular contact for example a contact starting with letter Z, in this case it gives the details of a person with A. I want this to change so that whenever I tap on a particular contact it should load its details. I am unable to figure out how to do it..

    contacts = [[db getContacts:@"Contacts"] componentsSeparatedByString:@","];
    [db cleanup];

    NSMutableArray *tempArray = [[NSMutableArray alloc] init];
    NSString *charString;
    for (int i=65; i<91; i++) {
        charString = [NSString stringWithFormat:@"%c",(char *)i];
        [tempArray addObject:charString];
    }
    [charString release];

    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];


    for (int i=0; i<[tempArray count]; i++) {
        NSMutableArray *contactsByIndex = [[[NSMutableArray alloc] init]autorelease];
        NSString *tempChar = [tempArray objectAtIndex:i];

        for (int j=0; j<[contacts count]-1; j++)
        {

            NSString *test = [contacts objectAtIndex:j];
            NSString *tempString = [test substringToIndex:1];

            if ([tempString isEqualToString:tempChar]) {
                [contactsByIndex addObject:[contacts objectAtIndex:j]];
            }


        }
        [dict setObject:contactsByIndex forKey:[tempArray objectAtIndex:i]];
    }
        self.contactNames = dict;

    NSArray *array = [[contactNames allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

    self.contactKeys = array;

    [dict release];
    [tempArray release];

    //---display the searchbar--- 
    self.tableView.tableHeaderView = searchBar; 
    searchBar.autocorrectionType = UITextAutocorrectionTypeYes;

    listOfContacts = [[NSMutableArray alloc] init]; 
    for (NSString *key in array)  
    {

        NSArray *contactsArray = [contactNames objectForKey:key]; 
        for (NSString *name in contactsArray) {
            [listOfContacts addObject:name];
        }
    }


   - (void) searchContactsTableView {

    //---clears the search result--- 
    [searchResult removeAllObjects];
    for (NSString *str in listOfContacts) {
        NSRange titleResultsRange = [str rangeOfString:searchBar.text options:NSCaseInsensitiveSearch];
        if (titleResultsRange.length > 0) 
            [searchResult addObject:str];

    }

}



- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Navigation logic may go here. Create and push another view controller.
    NSString *selectedRow=nil;
    if (isSearchOn) {
        selectedRow=[searchResult objectAtIndex:indexPath.row];
    }

    DetailViewController *detailViewController;
    int section_index=[indexPath indexAtPosition:[indexPath length]-2];
    int sugarid_Index = [indexPath indexAtPosition: [indexPath length]-1];
    NSString* sectionName=[contactKeys objectAtIndex:section_index];
    NSLog(@"%@",sectionName);

//This is a method which gets the details of a particular contact based on the section and the row selected..Contacts is the table name

    NSString *getContact=[db getId:@"Contacts" bySection:sectionName andIndex:sugarid_Index];
    id=[db getContact:@"Contacts" id:getContact];
    // Pass the selected object to the new view controller.
    detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    detailViewController.eachContact=contactForSugarId;
    [self.navigationController pushViewController:detailViewController animated:YES];

}

When I search for a contact it should search for the name in database and should return its details. Is there a way to do it..please let me know or is there a way to get the name of the cell i.e. the contact name so that I can use that in one of my database methods to retrieve the details of the contact I selected.

A: 

Off hand it sounds like you're looking in the wrong array of contacts after the search. You need to have two arrays. One with all the contacts, and one with the filtered contacts. When you search, put all the results in order in the filtered list, and pull the details from that one.

Does this make sense?

If not, try posting a bit of code, and explaining your structure.

DexterW
Thanks for the reply Greelmo..I posted some code..please have a look at it..I need to finish off this task as it is very imp to me and I am unable to figure out how to do it as I am a newbie...please help me...
racharambola
Greelmo..can you check the code and tell me the procedure to approach it..I am having problem in writing didSelectRowAtIndexPath for search functionality
racharambola
I don't have time to write the code for you. Just go look up some tutorials on using searchbars on tableviews.Here's a hint: You need 2 tableviews, and you can check which one is being used, because didSelectRowAtIndexPath gives you the tableView.
DexterW
Thanks for the reply Greelmo..I will try it!!!
racharambola