在ios中显示与地址簿中的名称对应的emailaddress

时间:2014-03-19 11:05:49

标签: ios objective-c tableview addressbook predicate

我有一个应用程序,其中我有一个UITextField,当我在UITextField中输入一个字符时,它会搜索我的地址簿中的任何匹配项,如果找到任何匹配项,它会在UITableView上显示相应人员的姓名和电子邮件地址。 / p>

我的问题是我无法使用地址簿上的谓词正确搜索。当我输入任何字符时,它总是显示最后一条记录是否与我的谓词匹配。

这是我的代码。这是我的textfieldchange方法:

-(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;
   }

}

这是我从地址簿中获取电子邮件和人名并保存在数组中的代码

-(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];

    }
}

这是我的cellforrowAtIndexPath方法

-(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;
}

1 个答案:

答案 0 :(得分:0)

你的错误在那里:

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

密钥应为@"name"@"email",而不是特定联系人的姓名。排序描述符相同。