2012-10-15 25 views
0

我有一个AddressBook框架奇怪的行为。 我创建和展示人员选取控制器是这样的:从ABPeoplePickerNavigationController获取人员时缺乏数据

ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; 
picker.peoplePickerDelegate = self; 
NSArray *displayedItems = [NSArray arrayWithObjects:[NSNumber numberWithInt:kABPersonFirstNameProperty], [NSNumber numberWithInt:kABPersonLastNameProperty], nil]; 
picker.displayedProperties = displayedItems; 
[self presentViewController: picker animated:YES completion: nil]; 

然后委托我有以下几点:

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{ 
    myPersonRec = person; 
    [self dismissViewControllerAnimated:YES completion: nil]; 
    return NO; 
} 

后,当我尝试访问myPersonRec性质,我只能读取头名和姓氏(显示在人员选择器中),所有其他属性均为零。如果我将返回值更改为YES,我会收到电话号码和所有内容,但无论如何都无法获取人物图片。我究竟做错了什么?

回答

0

问题源发现:

ABPerson对象未加载到存储器整个一次。它被部分加载,并且在需要时加载新的字段或图像,并且要被正确加载,该对象应该被绑定到存在的ABAddressBook实例。当我使用人物选择器视图控制器时,它引用它自己的ABAddressBook实例,该实例在选取器被解散后发布,因此在viewcontroller解除后(但之前加载的条目仍可访问),我无法获得任何新数据。

为了解决这个问题,我在我的模型类singleton中创建了一个ABAddressBook共享实例,并在需要时使用它。由于我只是从地址簿中阅读,所以应该是很好的解决方案。

因此,选择器创建的代码看起来应该是这样最后:

ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; 
picker.peoplePickerDelegate = self; 
NSArray *displayedItems = [NSArray arrayWithObjects:[NSNumber numberWithInt:kABPersonFirstNameProperty], [NSNumber numberWithInt:kABPersonLastNameProperty], nil]; 
picker.displayedProperties = displayedItems; 
picker.addressBook = [[MyModel instance] sharedAddressBookRef]; 
[self presentViewController: picker animated:YES completion: nil];