2013-02-28 3 views
1

Err, я тянул свои волосы, думая о пути с нескольких дней. Я получил все имена контактов и поместил их в массив, используя словарь.Доступ к контактному изображению из адресной книги по имени

У меня есть класс модели, содержащий список имен, теперь я хочу найти местоположение имени в списке контактов, в зависимости от которого я могу получить требуемое изображение контакта.

Первоначально гугле и выяснили, остающийся без ответа вопрос не в значительной степени подобное моему требованию, то же самое можно глянул here

Я попробовал несколько способов, ниже является одним из способов я реализовал:

EDIT

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [self loadReminders]; 

    ReminderClass *reminderToDisplay = [self.remindersArray objectAtIndex:indexPath.row]; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier]; 

    // Now create the cell to display the reminder data 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellIdentifier] autorelease]; 
     cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; 
     cell.textLabel.numberOfLines = 0; 
     cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0]; 
     cell.textLabel.adjustsFontSizeToFitWidth = YES; 
    } 

    tableView.backgroundColor = [UIColor clearColor]; 

    NSDateFormatter *dateFormat = [[[NSDateFormatter alloc]init]autorelease]; 
    [dateFormat setDateFormat:kDateFormat]; 
    NSDate *reminderDate = [dateFormat dateFromString:reminderToDisplay.Date]; 
    [dateFormat setDateFormat:kMinDateFormat]; 
    NSString *dateString = [dateFormat stringFromDate:reminderDate]; 

    NSString *valueString = [NSString stringWithFormat:@"%@'s %@",reminderToDisplay.Name,reminderToDisplay.Event]; 
    NSString *onString = [NSString stringWithFormat:@" on %@",dateString]; 
    NSString *reminderDetailsString = [valueString stringByAppendingString:onString]; 

    //Get the contact image based on name index from contact list 
    ABAddressBookRef addressBook = ABAddressBookCreate(); 
    CFStringRef reminderName = (CFStringRef)reminderToDisplay.Name; 
    CFArrayRef allPeople = ABAddressBookCopyPeopleWithName(addressBook, reminderName); 
    self.contactsList =[[[NSMutableArray alloc]init]autorelease]; 

    CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); 
    for (int i = 0; i < nPeople; i++) 
    { 
    ABRecordRef ref = CFArrayGetValueAtIndex(allPeople,i); 
    NSString *contactFirstNamePart = (NSString *)ABRecordCopyValue(ref,kABPersonFirstNameProperty); 
    NSString *contactFirstName = [[[NSString alloc] initWithString:contactFirstNamePart]autorelease]; 
    NSString *contactLastNamePart = (NSString *)ABRecordCopyValue(ref, kABPersonLastNameProperty); 

    if (contactLastNamePart == nil) 
    { 
     self.contactName = contactFirstName; 
    } 

    else 
    { 
     NSString *contactLastName = [[[NSString alloc] initWithString:contactLastNamePart]autorelease]; 
     NSString *contactLastNameString = [NSString stringWithFormat:@" %@",contactLastName]; 
     self.contactName = [contactFirstName stringByAppendingString:contactLastNameString]; 
     CFRelease(contactLastNamePart); 
    } 

    NSDictionary *contactsDictionary = [NSDictionary dictionaryWithObjectsAndKeys:self.contactName, kContactName, [NSNumber numberWithInt:i], kContactIndex, nil]; 
    [self.contactsList addObject:contactsDictionary]; 
    CFRelease(contactFirstNamePart); 
} 

NSDictionary *contactsDictionary = [self.contactsList objectAtIndex:indexPath.row]; 
self.contactName = [contactsDictionary objectForKey:kContactName]; 
int addressIndex = [[contactsDictionary objectForKey:kContactIndex]integerValue]; 

ABRecordRef recordReference = CFArrayGetValueAtIndex(allPeople, addressIndex); 
if (ABPersonHasImageData(recordReference)) 
{ 
    NSData *imageData = (NSData *)ABPersonCopyImageData(recordReference); 
    self.reminderImage = [UIImage imageWithData:imageData]; 
    CFRelease(imageData); 
} 

CFRelease(allPeople); 
CFRelease(addressBook); 

    UIImage *notificationImage = reminderImage; 

    if (notificationImage != nil) 
    { 
     UIImageView *imageView=[[[UIImageView alloc] initWithFrame:CGRectMake(240, 3, 70, 63)]autorelease]; 
     imageView.backgroundColor=[UIColor clearColor]; 
     [imageView setImage:notificationImage]; 
     cell.accessoryView = imageView; 
    } 
    else 
    { 
     UIImageView *imageView=[[[UIImageView alloc] initWithFrame:CGRectMake(240, 3, 70, 63)]autorelease]; 
     imageView.backgroundColor=[UIColor clearColor]; 
     UIImage *defaultImage = [UIImage imageNamed:kDefaultImage]; 
     [imageView setImage:defaultImage]; 
     cell.accessoryView = imageView; 
    } 
    cell.textLabel.text = reminderDetailsString; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    return cell; 
} 

Bad экрана Ошибка доступа выстрелил

enter image description here

Но я не смог выполнить требуемую задачу. Может кто-нибудь мне направить.

Спасибо всем заранее :)

+0

Я не понимаю, как вы итерацию о ver 'contactsList', используя этот' for (reminderToDisplay.Name в списке контактов) '? Что такое 'reminderToDisplay.Name' здесь? – HRM

+0

@HRM На самом деле reminderToDisplay.Name - это объект класса модели, который содержит все имена, сохраненные пользователем, поэтому я проверяю, существует ли имя в списке контактов, поскольку пользователь может также сохранить несколько пользовательских имен. Поэтому я хотел бы знать, где имя присутствует в списке контактов, скажем, расположение индекса. В зависимости от этого я могу получить контактное изображение. –

+0

. Проверьте сравнение с помощью NSString 'isEqualToString' вместо' self.contactName == reminderToDisplay.Name'. Кроме того, pls NSLog ur 'reminderToDisplay.Name' внутри' for' loop – HRM

ответ

1

Я делить образец фрагмент код я использовал в одном из моего недавнего приложения. Я изменил его в соответствии с требованиями к ur, а также учтите, что я отредактировал это в блокноте и может иметь некоторые ошибки опечатки. (В настоящее время у меня нет теста для проверки на Mac ..: P) Основная идея состоит в том, чтобы заполнить источник данных в viewDidLoad метод и использовать этот источник данных для обновления tableView. Надеюсь, что это поможет вам решить вашу проблему.

viewDidLoad

contactsToBeAdded=[[NSMutableArray alloc] init]; 
ABAddressBookRef addressbook = ABAddressBookCreate(); 
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressbook); 
CFIndex numPeople = ABAddressBookGetPersonCount(addressbook); 
bool hasPhoneNumber = false; 
for (int i=0; i < numPeople; i++) { 
    hasPhoneNumber = false; 
    ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i); 
    ABMutableMultiValueRef phonelist = ABRecordCopyValue(person, kABPersonPhoneProperty); 
    CFIndex numPhones = ABMultiValueGetCount(phonelist); 


    if(numPhones > 0){ 
     hasPhoneNumber = true; 

    } 
    if(hasPhoneNumber){ 
     NSString *firstName=(NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty); 
     NSString *lastName=(NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty); 

     CFTypeRef ABphone = ABMultiValueCopyValueAtIndex(phonelist, 0); 
     NSString *personPhone = (NSString *)ABphone; 

     NSMutableDictionary *dictToAdd = [[[NSMutableDictionary alloc]init]autorelease]; 
     if(firstName != nil && firstName != NULL){ 
      [dictToAdd setObject:firstName forKey:@"firstName"]; 
      CFRelease(firstName); 
     } 
     else{ 
      [dictToAdd setObject:@"" forKey:@"firstName"]; 
     } 
     if(lastName != nil && lastName != NULL){ 
      [dictToAdd setObject:lastName forKey:@"lastName"]; 
      CFRelease(lastName); 
     } 
     else{ 
      [dictToAdd setObject:@"" forKey:@"lastName"]; 
     } 

     if(personPhone != nil && personPhone != NULL){ 
      [dictToAdd setObject:personPhone forKey:@"mobile"]; 
      CFRelease(ABphone); 
     } 
     else{ 
      [dictToAdd setObject:@"" forKey:@"mobile"]; 
     } 

     //Get the first name and last name added to dict and combine it to full name 
     NSString *firstName = [dictToAdd objectForKey:@"firstName"]; 
     NSString *lastName = [dictToAdd objectForKey:@"lastName"]; 
     NSString *fullName = [firstName stringByAppendingString:lastName]; 

     //Now check whether the full name is same as your reminderToDisplay.Name 
     if(reminderToDisplay.Name isEqualToString:fullName) 
     { 
      CFDataRef imageData = ABPersonCopyImageData(person); 
      UIImage *image = [UIImage imageWithData:(NSData *)imageData]; 
      if(image != nil && image != NULL){ 
       [dictToAdd setObject:image forKey:@"image"]; 
       CFRelease(imageData); 
      } 
      else{ 
       [dictToAdd setObject:[UIImage imageNamed:TEMP_IMG] forKey:@"image"]; 
      } 
     } 

     [contactsToBeAdded addObject:dictToAdd]; 
    } 

    CFRelease(phonelist); 
} 
CFRelease(allPeople); 
CFRelease(addressbook); 

[self.tableView reloadData]; 

numberOfRowsInSection

return contactsToBeAdded.count; 

cellForRowAtIndexPath

static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) 
{ 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]autorelease]; 

} 

NSDictionary *contactToAdd; 
//This way you can get the data added in viewDidLoad method 
contactToAdd = [contactsToBeAdded objectAtIndex:indexPath.row]; 

NSString *fName = (NSString *)[contactToAdd objectForKey:@"firstName"]; 
NSString *lName = (NSString *)[contactToAdd objectForKey:@"lastName"]; 
UIImage *contactImg = (UIImage*)[contactToAdd objectForKey:@"image"]; 
+0

Большое вам спасибо за ответ, но опять же эксперимент был неудачным :(, на самом деле я поставил точку останова, что я наблюдал, было условие: if (reminderToDisplay.Name isEqualToString: fullName) не удалось –

+0

проверить, получаете ли вы правильное напоминаниеToDisplay.Name и fullName.'NSLog (reminderToDisplay.Name) ' – HRM

+0

Да, я зарегистрировал результаты и нашел наши имена контактов, то есть имена fullNames, содержащие имена с фамилией и фамилией, объединенные, без пробелов, поэтому позвольте мне включить пробел между ними, чтобы затем я мог сравнить с моим напоминанием имена –

0

, когда вы используете «» ABAddressBookCopyArrayOfAllPeople вы получаете массив лиц в адресной книге. Я считаю, что это тип ABPerson.

Теперь вы можете перебрать их список, как и вы. Для каждого вызова одной записи «ABPersonCopyImageData», и это даст вам данные изображения как CFDataRef.

И помните, что CFDataRef - это бесплатный инструмент для NSData.

+0

Спасибо за ответ, но здесь беспокойство касается не только доступа к изображению каждого человека! Но я хотел бы знать, где имена, которые я держу, существуют в списке контактов. Так что, основываясь на индексе, я могу получить доступ к этим контактным изображениям –

+0

Мои извинения, я просто не понимаю вопроса тогда. – John

+0

Фактически я получаю контакты в iphone с использованием структуры адресной книги (скажем, у меня есть A, B, C, D, E и т. Д.). У меня есть список имен, скажем, B, D, E, A, H, N и т. Д., Например, рассмотрим «B», имя BI hold находится в индексе 1 моего списка контактов. я бы хочу узнать то же самое, чтобы я мог получить контактное изображение B, надеюсь, что вы получили его сейчас :) Примечание: обратите внимание, что я храню имена, существующие в списке контактов, а также пользовательские имена, введенные/сохраненные пользователем !! –

0

Просто попробуйте изменить свой код следующим образом. Вы добавляете элементы словарных ур contactsList, поэтому получить каждый словарь и проверить, содержит ли он ключ, соответствующий вашему reminderToDisplay.Name, если да, то сделать ур материал ..

for (NSDictionary* dict in contactsList) 
{ 
    if(nil != [dict objectForKey:reminderToDisplay.Name]) 
    { 
    //take image here 
    } 
} 

UPDATE:

//This is the reminder's name you want to get contact image 
ReminderClass *reminderToDisplay = [self.remindersArray objectAtIndex:indexPath.row]; 

//Here you are adding your contacts with full name as object and kName as key, but check ur kName here 
NSDictionary *contactsDictionary = [NSDictionary dictionaryWithObjectsAndKeys:self.contactName, kName, [NSNumber numberWithInt:i], kIndex, nil]; 
[self.contactsList addObject:contactsDictionary]; 

//I dont think this part is needed in ur code 
NSDictionary *contactsDictionary = [self.contactsList objectAtIndex:indexPath.row]; 
self.contactName = [contactsDictionary objectForKey:kName]; 
int addressIndex = [[contactsDictionary objectForKey:kIndex]intValue]; 

Теперь вы имена ваших контактов в качестве словаря в массиве contactsList, итерация массива и проверка того, содержит ли словарь ваше напоминаниеToDisplay.Name как ключ.

for (NSDictionary* dict in contactsList) 
{ 
    //Please note that your dict contains key as kName and object as contact name. 
    if(nil != [dict objectForKey:reminderToDisplay.Name]) 
    { 
    } 
} 

Кроме того, я чувствую, что вы можете сделать это в одном цикле, как, когда вы Итерируя Addressbook себя, вы можете проверить, является ли имя контакта в вашем reminderlist и при наличии затем извлечь изображение.

Надеется, что это helps..all лучшим ...

+0

Пожалуйста, найдите обновленный код в разделе «РЕДАКТИРОВАТЬ» в сообщении, так как вы предложили не работать! –

+0

Попробуйте записать содержимое 'dict' и' reminderToDisplay.Name' – HRM

+0

для (NSDictionary * dict in contactsList) { NSLog (@ "Словарь% @", dict); NSLog (@ "Имя% @", reminderToDisplay.Name); если (ноль =! [ДИКТ objectForKey: reminderToDisplay.Name]) { ..... }} } Dict значения показывает список контактов, т.е. имя и индекс адреса, reminderInstance.Name как обычно держит все напоминания имена –

Смежные вопросы