0

I am trying to implement search bar in my custom Contacts Book. I created NSDictionary for search data and added to my dictionary 4 mutable arrays, include names, last name, phone types, phone numbers.

When I am trying to search in NSDictionary, my app is crashing on cell create. And When I am searching by one array only (from dictionary valueforkey or directly from array) it's working partially, but taking another strings (for example last name) always from the first contact in the list. Bacause not all parameters in a loop, So I have to search by every parameter to get right first name and last name in my contacts.

here is my code:

#pragma mark SEARCH_BAR

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {

    [self.tableSearchBar resignFirstResponder];
}



-(void)searchBar:(UISearchBar *)serachBar textDidChange:(NSString *)searchText {

    [filteredStrings removeAllObjects];



    if (searchText.length == 0) {

        isFiltered = NO;

    } else {

        isFiltered = YES;

//here aim creating NSDictionary with 4 Mutable Arrays

        NSDictionary *filteredContacts = [NSDictionary dictionaryWithObjectsAndKeys:
                                          contacts.firstNames, @"First Name",
                                          contacts.lastNames, @"Last Name",
                                          contacts.phoneTypes, @"Phone Type",
                                          contacts.phoneNumbers, @"Phone Numbers",
                                          nil];


        //[filteredStrings addObject:filteredContacts];

        for (NSString *str in filteredContacts) { // in this case for (NSString *str in [filteredContacts valueForKey:@"First Name"]) all working partially
            NSRange stringRange = [str rangeOfString:searchText options:NSCaseInsensitiveSearch];
            if (stringRange.location != NSNotFound) {

                filteredStrings = [[NSMutableArray alloc]init];

                [filteredStrings addObject:str];
            }
        }



    }


    [self.contactsTableView reloadData];
}



-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (isFiltered) {
        return [filteredStrings count];
    }
    return [contacts.firstNames count];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellID = @"Cell";

    abCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];

    if (!cell) {
       cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    }

    if (!isFiltered) {

        cell.firstNameLabel.text = [contacts.firstNames objectAtIndex:indexPath.row];
        cell.lastNameLabel.text = [contacts.lastNames objectAtIndex:indexPath.row];
        cell.contactImage.image = [UIImage imageNamed:@"NOIMG.png"];

    } else {

    cell.firstNameLabel.text = [filteredStrings objectAtIndex:indexPath.row]; // Here my app is crashing when trying to search by all nsdictionary.
    cell.lastNameLabel.text = [filteredStrings objectAtIndex:indexPath.row];
    //cell.contactImage.image = [UIImage imageNamed:@"NOIMG.png"];

    }

    return cell;


}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    [self.contactsTableView deselectRowAtIndexPath:indexPath animated:YES];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {


    if ([[segue identifier] isEqualToString:@"NextView"]) {

        //if (!isFiltered) {
        ContactDetailsViewController *nextController = [segue destinationViewController];
        NSIndexPath *indexPath = [[[self contactsTableView] indexPathsForSelectedRows] objectAtIndex:0];
        [nextController setPhoneTypes:[contacts.phoneTypes objectAtIndex:[indexPath row]]];
        [nextController setPhoneNumbers:[contacts.phoneNumbers objectAtIndex:[indexPath row]]];
    //}

        /*else {

            ContactDetailsViewController *nextController = [segue destinationViewController];
            NSIndexPath *indexPath = [[[self contactsTableView] indexPathsForSelectedRows] objectAtIndex:0];
            [nextController setPhoneTypes:[contacts.phoneTypes objectAtIndex:[indexPath row]]];
            [nextController setPhoneNumbers:[contacts.phoneNumbers objectAtIndex:[indexPath row]]];
        }*/

    }
}
rmaddy
  • 314,917
  • 42
  • 532
  • 579
Anton
  • 3,102
  • 2
  • 28
  • 47
  • What's this: `abCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; if (!cell) { cell = [tableView dequeueReusableCellWithIdentifier:cellID]; }` Why do you expect dequeue to work the second time? You are returning nil from `cellForRowAtIndexPath` resulting in crash. – maroux May 30 '13 at 19:27
  • `filteredStrings = [[NSMutableArray alloc]init]` You realize you're recreating the array in a loop. Something is very wrong here. Also, you should be filtering in `searchDisplayController:shouldReloadTableForSearchString:`, are you not using the default search display controller? – maroux May 30 '13 at 19:33
  • @Mar0ux this is custom cell class. I'll try to use default search display controller. And will report you – Anton May 30 '13 at 19:52

0 Answers0