在IOS

2014-03-19 45 views
0

我有,我有一個的UITextField那裏,當我的UITextField輸入一個字符使其搜索我的地址簿中的任何比賽,如果找到任何匹配它的顯示名稱和應用程序對應的名字從地址簿中顯示EMAILADDRESS UITableView上相應人員的電子郵件地址。在IOS

我的問題是我無法在我的地址簿上使用謂詞正確搜索。當我輸入任何字符時,它總是顯示最後一個記錄,它是否與我的謂詞相符。

這是我的代碼。這是我的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; 
} 

回答

0

您的問題在那裏:

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

關鍵應該是@"name"@"email",不是特定聯繫人的姓名。相同的排序描述符。