2014-01-13 2 views
0

NSLog()을 사용하여 모든 휴대 전화의 연락처를 콘솔에 인쇄하려고합니다. 현재이 코드는 단지 (null)입니다.ABAddressBookRequestAccessWithCompletion()에서 연락처 배열을 가져 오지 않는 경우

.H

@property (nonatomic, strong) NSMutableArray *contactsObjects; 

하는 .m

@synthesize contactsObjects; 
//lazy instantiation. 
- (NSMutableArray *)contactsObjects 
{ 
    if(!contactsObjects) 
    { 
     contactsObjects = [[NSMutableArray alloc]init]; 
    } 

    return contactsObjects; 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    CFErrorRef error = nil; 

    // Request authorization to Address Book 
    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, &error); 

    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { 
     ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) { 
      if (granted) { 
       // First time access has been granted, add all the user's contacts to array. 
       CFMutableArrayRef contactsObjects = ABAddressBookCopyArrayOfAllPeople(addressBookRef); 
      } else { 
       // User denied access. 
       // Display an alert telling user that they must allow access to proceed to the "invites" page. 
      } 
     }); 
    } 
    else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { 
     // The user has previously given access, add all the user's contacts to array. 
     CFMutableArrayRef contactsObjects = ABAddressBookCopyArrayOfAllPeople(addressBookRef); 
    } 
    else { 
     // The user has previously denied access 
     // Send an alert telling user that they must allow access to proceed to the "invites" page. 
    } 

    NSLog(@"%@", contactsObjects); 
} 

내가이 경고 이곳에 오기 :

enter image description here

나는 아무 생각이 내가 내 연락처의 이름과 번호를 콘솔에 제대로 인쇄하기 위해해야 ​​할 일입니다.

연락처 이름과 번호는 어떻게 인쇄합니까?

+0

ivar를 섀도 잉하는 것에 대한'viewWillAppear :'에 또 다른 경고가 없습니까? 또는 선언자가 설정자를 가리키는 변수에 대한 오류가 있습니까? –

+0

나는 실제로는 아니야. 두 가지 오류는 "노란색!" 오류, 그리고 그들은 단지 위에 게시 오류입니다. – Chisx

+0

어떤 Xcode 버전을 사용하고 있습니까? 명시 적으로'contactsObjects' 합성하고 있습니까? –

답변

2

당신은 당신의 코드 범위의 문제가보십시오. 에있는 contactsObjects 변수는 contactsObjects이라는 ivar와 관련이 없습니다. 같은 이름을 사용하는 새 변수를 선언하고 있습니다. 반대로 NSLog()은 ivar입니다. 그러나 다른 변수를 설정해도 아무것도 표시되지 않으므로 (null)이 표시됩니다. 이는 NSLog()이 "no object"를 나타내는 방식입니다.

새 변수 선언을 작성하지 않고 ivar을 사용하여이를 수정하십시오.

if (granted) { 
    contactsObjects = ABAddressBookCopyArrayOfAllPeople(addressBookRef); 

else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { 
    contactsObjects = ABAddressBookCopyArrayOfAllPeople(addressBookRef); 

또한이 캐스팅해야합니다. (당신이 그와 함께 길 아래에 문제가있을 수 있으므로, 또한, 함수가 변경 가능한 배열을 반환하지 않습니다)

contactsObjects = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBookRef); 

두 번째 문제는 ABAddressBookRequestAccessWithCompletion()이 중지되지 않고 완료 블록이 실행될 때까지 대기한다는 것입니다. 액세스가 요청되는 동안 나머지 메소드는 계속 수행되므로 contactsObjects이 실제로 설정되기 전에 NSLog()에 도달합니다.

+0

그렇다면'(__bridge_transfer NSArray *) '를 사용하면'호환되지 않는 포인터 유형 '에 대한 경고 메시지가 표시되므로 NSMutableArray가 아닌 NSArray로 변수 ** contactsObjects **를 다시 선언해야합니까? 그리고 당신은'ABAddressBookRequestAccessWithCompletion()'메소드 다음에 중단 점이 필요하다고 제안합니까? 또한 (__bridge NSMutableArray *)는 아무 경고도 발생시키지 않았지만 콘솔이 이름이나 # 대신 주소를 출력하도록했습니다. – Chisx

+0

예, 등록 정보의 유형을 변경하십시오. NSMutableArray 로의 캐스팅은 거짓말입니다. 배열의 변경 가능성은 변경되지 않습니다. 중단 점은 필요하지 않습니다. 중단 점은 디버깅을위한 것입니다. 접근을 요청할 때,'contactObjects'는 완료 블록이 실행될 때까지 설정되지 않을 것이고,'viewWillAppear :'가 끝나기 전이거나되지 않을 수도 있습니다. –

+0

확인. 내가 가져갈거야. – Chisx

2

당신은 그것이 null을 인쇄하고 오류가 난다고합니다. 그러나 이것은 당신의 잘못을 설명 할 것입니다.

contactObjects은 if 블록과 else if 블록 내에 정의됩니다. 따라서 귀하가 귀하의 조건을 벗어날 때까지는 더 이상 정의되지 않습니다.

- (void)viewWillAppear:(BOOL)animated 
{ 
    CFErrorRef error = nil; 

    // Request authorization to Address Book 
    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, &error); 

    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { 
     ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) { 
      if (granted) { 
       // First time access has been granted, add all the user's contacts to array. 
       contactsObjects = ABAddressBookCopyArrayOfAllPeople(addressBookRef); 
      } else { 
       // User denied access. 
       // Display an alert telling user that they must allow access to proceed to the "invites" page. 
      } 
     }); 
    } 
    else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { 
     // The user has previously given access, add all the user's contacts to array. 
     contactsObjects = ABAddressBookCopyArrayOfAllPeople(addressBookRef); 
    } 
    else { 
     // The user has previously denied access 
     // Send an alert telling user that they must allow access to proceed to the "invites" page. 
    } 

    NSLog(@"%@", contactsObjects); 
} 
+0

'contactsObjects'는 거의 확실하게 여기에서 선언해서는 안됩니다. 나는 OP가 단지 그것을 ivar에 넣기를 원한다고 확신한다. 그것 이외에 이것은 그것입니다. –

+0

죄송합니다. 내 실수는 눈이 먼 것이어야합니다.하지만 코드와 변경 사항이 보이지 않습니다. 정확히 어디에서 변화를 일으켰는지 지적 해 주시겠습니까? – Chisx

+0

오, 기다려 봐요. – Chisx