2014-07-03 171 views
1

我试图使用预定义的方法收到通知时,地址簿更新

ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL); 
ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, self); 

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

我打电话我application:didFinishLaunchingWithOptions,然后我做的回调方法,如何使用C方法中自ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, self);addressBook获取更新?我如何更新我的tableview,如果我不能使用我的对象?

回答

5

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

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

更具体到类 -

- (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]; 
} 

确保self.wkListVC在您注册的更改回调不为零。

+0

我把我的上下文发送到回调函数'((__bridge void *)myClass)'? 当我这样做,我发现我的情况下等于零,所以我没有得到的对象。难道我做错了什么? –

+0

' - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions :(NSDictionary *)launchOptions { ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL,NULL); ABAddressBookRegisterExternalChangeCallback(addressBook,addressBookChanged,(__bridge void *)self.wkListVC); 返回YES; (@ AddressBook Changed“);} { } –

+0

'void addressBookChanged(ABAddressBookRef addressBook,CFDictionaryRef info,void * context) { NSLog(@”AddressBook Changed“); wbkABViewControllerTableViewController * myVC =(__bridge wbkABViewControllerTableViewController *)context; [myVC getPersonOutOfAddressBook]; } ' –