Iphone Objective-C地址簿

Iphone Objective-C地址簿,iphone,objective-c,addressbook,Iphone,Objective C,Addressbook,我有两个Objective-C类,它们继承自UIViewController,我正在尝试一种不同的方法来学习如何与iPhone的通讯录交互。苹果提供的假设是所有东西都在一个类中,但这不是我需要的方式。我的目标是在选择一个人后关闭通讯录视图。请看一看,让我知道如何在没有CallerClass实现ABPeoplePickerNavigationControllerDelegate的情况下实现这一点。谢谢 --编辑-- 它似乎归结为[自我否定Modalviewcontrolleranimated:是]

我有两个Objective-C类,它们继承自UIViewController,我正在尝试一种不同的方法来学习如何与iPhone的通讯录交互。苹果提供的假设是所有东西都在一个类中,但这不是我需要的方式。我的目标是在选择一个人后关闭通讯录视图。请看一看,让我知道如何在没有CallerClass实现ABPeoplePickerNavigationControllerDelegate的情况下实现这一点。谢谢

--编辑--

它似乎归结为[自我否定Modalviewcontrolleranimated:是];在CalleeClass.m中没有任何效果。我似乎仍然无法从这个命令中得到关闭通讯簿的反应

CallerClass.m

#import "CallerClass.h"

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

#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

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

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

幸运的是,正如
的文档所示,dismissModalViewControllerAnimated:
注意:

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

因此,这应该是可行的:

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

现在确定你在问什么。CallerClass已经不是AB委托,因为你在doIt method.pxl中将CalleeClass设置为委托,我知道这一点。实现这一点的一个解决方案是将委托的所有方法包装在Caller类中,并完全删除被调用方,但这不是我想要的,因此,我正在寻找解决方案是使用两个类来实例化和访问通讯簿条目。我所说的是,“我可以让调用者成为委托人,但我需要的是让被调用者成为委托人。在这里,我让被调用者成为委托人,某种原因导致它无法工作。我如何补救?”谢谢!我正在使用self.name=(NSString*)ABRecordCopyValue(person,kABPersonAddressProperty)执行此操作;我希望在执行此操作后,我能够使用:[self dismissModalViewControllerAnimated:YES]关闭通讯簿;但情况似乎并非如此。这篇文章的全部意图不是将选择器用作普通控制器,而是如上所述的方式。我基本上需要一次性提取数据,并且不再引用它,因此拥有一个可移植的标识符与我无关。
- (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
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {
    self.name = (NSString *)ABRecordCopyValue(person,kABPersonAddressProperty);
    [peoplePicker dismissModalViewControllerAnimated:YES];
    return NO;  
}