我有两个继承自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
答案 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时再次使用选择器。