0

I have an application in which I have a UITextField where when I enter a character in UITextField it searches for any matches in my address book and if any match is found it display name and emailaddress of the respective person on a UITableView.

My problem is I am not able to search properly using predicate on my address book. When I enter any character it always displays the last record whether it matches my predicate or not.

This is my code. This is my textfieldchange method:

-(void)textFieldDidChange:(UITextField *)txtFld {
    [self fetchAddressBook];
    NSString *dictionaryKey = contact.name;
    NSString *predicateString = contact.email;
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K CONTAINS[cd] %@", dictionaryKey, predicateString];

    listFiles = [NSMutableArray arrayWithArray:[self.namearray
                                         filteredArrayUsingPredicate:predicate]];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                         initWithKey:contact.name  ascending:YES] ;
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    NSArray *sortedArray = [listFiles sortedArrayUsingDescriptors:sortDescriptors];
    if ([sortedArray count]>0)
    {
        tblView.hidden=FALSE;
        txtSendAmount.hidden=TRUE;
        txtSendMessage.hidden=TRUE;
        [tblView reloadData];
    }
   else if ([sortedArray count]==0)
   {
       tblView.hidden=TRUE;
       txtSendAmount.hidden=FALSE;
       txtSendMessage.hidden=FALSE;
   }

}

this is the code where i am fetching my email and name of person from address book and saving in an array

-(void)fetchAddressBook
{
   CFErrorRef error = nil;
    ABAddressBookRef allPeople = ABAddressBookCreateWithOptions(NULL,&error);
    CFArrayRef allContacts = ABAddressBookCopyArrayOfAllPeople(allPeople);
    CFIndex numberOfContacts  = ABAddressBookGetPersonCount(allPeople);
    NSMutableArray *testarray = [[NSMutableArray alloc] init];
    NSMutableDictionary *addressdict = [[NSMutableDictionary alloc] init];
    for(int i = 0; i < numberOfContacts; i++){
        name = @"";
        NSString* phone = @"";
        email = @"";
        contact = [[MContact alloc] init];
        ABRecordRef aPerson = CFArrayGetValueAtIndex(allContacts, i);
        ABMultiValueRef fnameProperty = ABRecordCopyValue(aPerson, kABPersonFirstNameProperty);
        ABMultiValueRef lnameProperty = ABRecordCopyValue(aPerson, kABPersonLastNameProperty);

        ABMultiValueRef phoneProperty = ABRecordCopyValue(aPerson, kABPersonPhoneProperty);
        ABMultiValueRef emailProperty = ABRecordCopyValue(aPerson, kABPersonEmailProperty);

        NSArray *emailArray = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(emailProperty);
        NSArray *phoneArray = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(phoneProperty);


        if (fnameProperty != nil) {
            contact.name = [NSString stringWithFormat:@"%@", fnameProperty];
        }
        if (lnameProperty != nil) {
            contact.name = [contact.name stringByAppendingString:[NSString stringWithFormat:@" %@", lnameProperty]];
        }

        if ([phoneArray count] > 0) {
            if ([phoneArray count] > 1) {
                for (int i = 0; i < [phoneArray count]; i++) {
                    phone = [phone stringByAppendingString:[NSString stringWithFormat:@"%@\n", [phoneArray objectAtIndex:i]]];
                }
            }else {
                phone = [NSString stringWithFormat:@"%@", [phoneArray objectAtIndex:0]];
            }
        }

        if ([emailArray count] > 0) {
            if ([emailArray count] > 1) {
                for (int i = 0; i < [emailArray count]; i++) {
                    contact.email = [contact.email stringByAppendingString:[NSString stringWithFormat:@"%@\n", [emailArray objectAtIndex:i]]];
                }
            }else {
                contact.email = [NSString stringWithFormat:@"%@", [emailArray objectAtIndex:0]];
            }
        }   
        [self.emailnamearray addObject:contact];
        self.namearray = [emailnamearray copy];

    }
}

this is my cellforrowAtIndexPath method

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   UITableViewCell *cell = [tblView dequeueReusableCellWithIdentifier:@"eventCell"];

    if(!cell){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"eventCell"];
    }
    MContact *addressdict = [listFiles objectAtIndex:indexPath.row];
    cell.textLabel.text=addressdict.name;
    cell.detailTextLabel.text=addressdict.email;
    return cell;
}
halfer
  • 19,824
  • 17
  • 99
  • 186
Rani
  • 3,333
  • 13
  • 48
  • 89

1 Answers1

0

Your bug is there:

NSString *dictionaryKey = contact.name;
NSString *predicateString = contact.email;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K CONTAINS[cd] %@", dictionaryKey, predicateString];

The key should be @"name" or @"email", not a particular contact's name. Same for the sort descriptor.

Thomas Deniau
  • 2,488
  • 1
  • 15
  • 15