2009-05-24 65 views
0

我想仅显示一个ABPeoplePicker,其中只有定义了地理地址的人员。无法在不崩溃的情况下设置ABPeoplePickerNavigationController的地址簿属性

所以我创建一个地址簿,并删除不具有地址的人:

addressBook = ABAddressBookCreate(); 
NSArray *peopleList = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook); 
NSLog(@"There are %d people in addressBook", ABAddressBookGetPersonCount(addressBook)); 
for (id peopleRecord in peopleList) { 
    ABMultiValueRef mv = ABRecordCopyValue((ABRecordRef)peopleRecord, kABPersonAddressProperty); 
    CFIndex numberOfAddresses = ABMultiValueGetCount(mv); 
    if(numberOfAddresses == 0) { 
    CFErrorRef err; 
    ABAddressBookRemoveRecord(addressBook, (ABRecordRef)peopleRecord, &err); 
    } 
} 
[peopleList release]; 
NSLog(@"There are now %d people in addressBook", ABAddressBookGetPersonCount(addressBook)); 
ABPeoplePickerNavigationController *peoplePicker = [[ABPeoplePickerNavigationController alloc] init]; 
NSNumber* addressProp = [NSNumber numberWithInt:kABPersonAddressProperty]; 
[peoplePicker setAddressBook:addressBook]; 
peoplePicker.displayedProperties = [NSArray arrayWithObject:addressProp]; 
[peoplePicker setPeoplePickerDelegate:self]; 
[self presentModalViewController:peoplePicker animated:YES]; 

有关信息,过滤之前,我有125条记录,并在过滤之后我有93条记录。

当我显示peoplePicker并通过它滚动,它与崩溃:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFArray objectAtIndex:]: index (49) beyond bounds (49)' 

任何想法有什么不对?

回答

0

事实上,NSRangeException的值是49(而不是93和125之间的某个数字),我最初怀疑它与此地址簿没有直接关系。为objc_exception_throw添加一个断点。这会让你在异常时掉入调试器,让你看到谁在抛出它。

+0

它破坏了一些私人类:ABMembersController。所以我想当删除记录时的地址簿已损坏:如果我注释ABAddressBookRemoveRecord行,它不会崩溃。 – 2009-05-25 06:43:54

相关问题