在通讯录更新时收到通知

我正在尝试使用预定义的方法从addressBook获取更新

 ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL); ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, self); void addressBookChanged(ABAddressBookRef addressBook, CFDictionaryRef info, void *context) { NSLog(@"AddressBook Changed"); [self getContactsFromAddressBook]; } 

我打电话给ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, self); 在我的application:didFinishLaunchingWithOptions ,然后我做的callback方法,如何可以使用自己内部的C方法? 我如何更新我的tableview,如果我不能使用我的对象?

您不能在该函数中直接使用self ,但是当您注册更改callback时,您将自我作为上下文传递,因此它将作为addressBookChanged函数中的parameter passing。

 void addressBookChanged(ABAddressBookRef addressBook, CFDictionaryRef info, void *context) { NSLog(@"AddressBook Changed"); YourClass *yourInstance = (__bridge YourClass *)(context) [yourInstance getContactsFromAddressBook]; } 

更具体到你的class级 –

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL); ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, self.wkListVC); return YES; } void addressBookChanged(ABAddressBookRef addressBook, CFDictionaryRef info, void *context) { NSLog(@"AddressBook Changed"); wbkABViewControllerTableViewController *myVC = (__bridge wbkABViewControllerTableViewController *)context; [myVC getPersonOutOfAddressBook]; } 

确保在注册更改callback时self.wkListVC不为零。