在我写的应用程序中,我允许用户将联系人与事件相关联。他们可以使用地址簿UI框架添加新的或现有的联系人。
联系人关联后,会显示这些联系人,用户可以点击这些联系人以显示ABPersonViewController
。编辑似乎有效,但当关闭人物视图时,不会保存更改。
以下是相关代码:
ABPersonViewController *personController = [[ABPersonViewController alloc] init];
personController.personViewDelegate = self;
personController.allowsEditing = YES;
personController.displayedPerson
[self.navigationController pushViewController:personController animated:YES];
[personController release];
编辑联系人并关闭人员视图后,如果我再次点击该联系人,则不会出现任何更改的信息。
我尝试创建ABAddressBookRef
属性,并使用
personController.addressBook = ab;
然后保存地址簿,但这也不起作用。
修改
我已经实施了<ABPersonViewControllerDelegate>
。它只有一种方法,如果我没记错的话,未能实现它会阻止ABPersonViewController工作。
以下是我的完整实施:
- (BOOL)personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
return YES;
}
据我所知,这只意味着控制器会正常运行。
编辑2:
好的,所以我才意识到控制器没有显示除了名字之外的所选人员的任何信息。我认为这意味着我的ABRecordRefs在某种程度上是不正确的。我会调查。
我将联系人存储为包含记录ID的NSNumbers数组。这是我的代码(其中contactIDs是记录ID数组,ab是ABAddressBookRef
):
NSMutableArray *contactArray = [NSMutableArray array];
for (NSNumber *contactNumber in contactIDs) {
NSInteger contactID = [contactNumber intValue];
[contactArray addObject:ABAddressBookGetPersonWithRecordID(ab, contactID)];
}
这似乎有效,因为当我选择联系人时会加载正确的名称。但是,不会显示其他信息。
答案 0 :(得分:1)
我得到了它的工作。问题是我使用了两个不同的ABAddressBookRef。
我使用一个ABAddressBookRef创建了一个ABRecordRefs数组(如我编辑过的问题所示),但是当我从数组中读取ABRecordRef时,我使用的ABAddressBookRef已经被释放了。
我在我的类实例的整个生命周期中创建了一个ABAddressBookRef实例,并且它有效。
答案 1 :(得分:0)
您需要设置所有地址簿委托方法来解决此问题。 Go to this Link
答案 2 :(得分:0)
你是如何创建AddressBook的?您使用的是ABAddressBookCreate()
吗?
此外,您应该确保正确实施ABPersonViewControllerDelegate
。
请查看此示例http://developer.apple.com/library/ios/#samplecode/QuickContacts/Introduction/Intro.html
我相信它包含你所需要的一切!
更新您应该尝试 ABAddressBookSave 方法!
干杯,
Thang