Objective-C地址簿

时间:2009-10-22 19:43:39

标签: iphone objective-c addressbook

我有两个继承自UIViewController的Objective-C类,我正在尝试一种不同的方法来学习如何与iPhone的地址簿进行交互。 example Apple提供假设所有内容都在一个类中,但这不是我需要它完成的方式。我的目标是在选择一个人后关闭地址簿视图。请看一下,让我知道如何在没有CallerClass实现ABPeoplePickerNavigationControllerDelegate的情况下实现这一目标。谢谢!

- 编辑 -

它似乎正在沸腾的是[self dismissModalViewControllerAnimated:YES];在CalleeClass.m中没有任何效果。我似乎无法从这个命令中得到关闭地址簿的反应。

CallerClass.m

#import "CallerClass.h"

@implementation CallerClass
- (IBAction)openAddressBook {
    CalleeClass *cc = [[CalleeClass alloc] init];
    [self presentModalViewController:[cc doIt] animated:YES];
}

CalleeClass.h

#import <UIKit/UIKit.h>
#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>

@interface CalleeClass : UIViewController <ABPeoplePickerNavigationControllerDelegate> {
    NSString *name;
}

-(ABPeoplePickerNavigationController *)doIt;

@property (nontoxic, retain) NSString *name;

@end

CalleeClass.m

#import <UIKit/UIKit.h>
#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>
#import "CalleeClass.h"

@implementation CalleeClass
@synthesize name;

...(默认ABPeoplePickerNaviationControllerDelegate实现在列出的内容之外)

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {}
    return self;
}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {
    self.name = (NSString *)ABRecordCopyValue(person,kABPersonAddressProperty);

    [self dismissModalViewControllerAnimated:YES];
    return NO;  
}

-(ABPeoplePickerNavigationController *)doIt {
    ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
    picker.peoplePickerDelegate = self;
    return picker;
}

@end

2 个答案:

答案 0 :(得分:1)

如果问题是,正如您所说,[self dismissModalViewControllerAnimated:YES]CalleeClass调用后无效,这是因为必须在呈现视图控制器上调用dismissModalViewControllerAnimated:(即您拨打presentModalViewController:Animated:的一个。由于您在CallerClass中没有对CalleeClass实例的引用,因此无效。

幸运的是,正如dismissModalViewControllerAnimated:注释的文档:

  

但是,如果在模态视图控制器本身上调用此方法,则为模态视图   控制器自动将消息转发给其父视图控制器。

所以这应该有效:

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {
    self.name = (NSString *)ABRecordCopyValue(person,kABPersonAddressProperty);
    [peoplePicker dismissModalViewControllerAnimated:YES];
    return NO;  
}

答案 1 :(得分:0)

一旦确定了您想要处理的联系人,就可以传递int32 recordID,尽管如API文档中所述,您可能也应该使用复合名称,因为您会注意到recordID是一个简单的值,以“1”开头,如果您的数据库已恢复到旧记录ID值中包含新联系人的手机,则可能会遇到麻烦。每次您需要从地址簿中访问某些内容时,您需要创建电话簿,但您可以立即关闭它,因此使用recordID可以打开,获取所需内容然后将其关闭。我的建议只是使用像普通视图控制器这样的选择器,直到获得recordID,解除它,然后保留该唯一标识符。需要查找新记录ID时再次使用选择器。