2010-01-20 2 views
1

내 iPhone에 저장되어있는 연락처의 이미지를 설정하려고합니다. 제가 snipt 코드 follwing을 사용 - (BOOL) peoplePickerNavigationController (ABPeoplePickerNavigationController *) peoplePicker shouldContinueAfterSelectingPerson (ABRecordRef) 인 {ABPersonSetImageData가 작동하지 않습니다.

UIImage *image = [UIImage imageNamed:@"icon.png"]; 
NSData *data=UIImagePNGRepresentation(image); 
CFDataRef dr = CFDataCreate(NULL, [data bytes], [data length]); 

ABAddressBookRef iPhoneAddressBook ABAddressBookCreate =(); CFErrorRef erf = NULL;

if (ABPersonSetImageData(person, dr, nil)) 
{ 
    NSLog(@"successfully set image"); 
} 
else 
{ 
    NSLog(@"not successfully set image"); 
} 

if(ABAddressBookSave(iPhoneAddressBook, &erf)) 
{ 
    NSLog(@"save %s",erf); 
} 
else { 
    NSLog(@"Not success"); 
} 



CFRelease(dr); 

CFRelease (iPhoneAddressBook); [self dismissModalViewControllerAnimated : YES];

return NO; 

}

모든 것은 노력하고 있지만, 상대의 이미지가 변경되지 않습니다. plz help!

답변

1

당신은 요구하고있다 :

이미지 데이터로 '전무'을 통과
if (ABPersonSetImageData(person, dr, nil)) 

..

+0

틀렸어 -이 함수는 다음과 같이 보입니다 :'bool ABPersonSetImageData (ABPersonRef person, CFDataRef imageData);' –

+0

으악! – Mobs

1

는보고 at this thread을 가져 가라. 이것은 동일한 코드입니다!

장점 : 귀하의 메서드에 전달한 person에 대한 참조가 주소록의 컨텍스트에서 유효합니까? 먼저 ABAddressBookGetPersonWithRecordID과 같은 함수를 사용하려고합니다. 대신 ABPersonRef을 전달하고 다른 주소록 참조에서 유효 할 것으로 예상합니다.

가 저자 : BTW

,이 라인

CFDataRef dr = CFDataCreate(NULL, [data bytes], [data length]); 

이 필요하지 않습니다 도움 듯 - NSData *CFDataRef이 상호 교환 :

있는 NSData가 "를 무료 브리지 "라고 말하면서 CF Foundation의 핵심 자료 인 CFData Reference를 참조하십시오. 즉, 핵심 Foundation 유형은 함수 또는 메소드 호출에서 브리지 된 Foundation 객체와 상호 교환 가능합니다. 따라서 NSData * 매개 변수를 보는 메서드에서 CFDataRef를 전달할 수 있으며 CFDataRef 매개 변수가있는 함수에서 한 형식을 다른 형식으로 캐스팅하여 컴파일러 경고를 표시하지 않을 NSData 인스턴스를 전달할 수 있습니다. 이는 NSData의 구체적인 서브 클래스에도 적용됩니다. 수신자 부담 브리징에 대한 자세한 내용은 교환 가능 데이터 유형을 참조하십시오.

(NSData documentation).

관련 문제