3

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

- 编辑 -

它似乎归结为 [self dismissModalViewControllerAnimated:YES]; 在 CalleeClass.m 中没有任何影响。我似乎仍然无法通过此命令关闭通讯簿。

调用者类.m

#import "CallerClass.h"

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

被调用者类.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

被调用者类.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
4

2 回答 2

1

如果问题是,如您所说,[self dismissModalViewControllerAnimated:YES]如果调用 from 没有效果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;  
}
于 2009-10-27T20:37:20.743 回答
0

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

于 2009-10-22T22:28:08.100 回答