我有一个应用程序,我正在使用ABAddressBook API阅读地址簿信息并选择一个人。我想从我的应用程序中提供一个链接,以启动Mac地址簿并预先选择特定用户。
我确信有几种方法可以做到这一点 - 我想出了一个似乎有用的方法,但感觉有点笨重。我启动了“Address Book.app”,如果成功,它会调用一点AppleScript来选择“currentPerson”uniqueId(来自ABRecord对象)。
- (void) notifyABSelect
{
NSString *src = [NSString stringWithFormat:@"tell application \"Address Book\"\r\n\tset selection to first person whose id is \"%@\" \r\nend tell", [currentPerson uniqueId]];
NSMutableDictionary *err = [NSMutableDictionary dictionary];
NSAppleScript *script = [[NSAppleScript alloc] initWithSource:src];
[script executeAndReturnError:&err];
[[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:self];
[src release];
[err release];
[script release];
}
- (IBAction) launchAddressBook:(id)sender
{
[[[NSWorkspace sharedWorkspace] notificationCenter]
addObserver:self
selector:@selector(notifyABSelect)
name:NSWorkspaceDidLaunchApplicationNotification
object:nil];
if ([[NSWorkspace sharedWorkspace] launchApplication:@"Address Book.app"] == YES)
{
[self notifyABSelect];
}
else
{
NSLog(@"Unable to launch address book");
}
}
如果地址簿之前已经选择了“所有联系人”以外的其他组,那么这种情况就会失败;它可能会或可能不会根据他们是否在所选组中找到该人。但是,在应用程序中第二次单击该链接会正确转到“所有联系人”并找到该人。
有什么方法可以实现这种行为?
答案 0 :(得分:3)
您可以改用URL。
[[NSWorkspace sharedWorkspace] openURL:
[NSURL URLWithString:
[NSString stringWithFormat:
@"addressbook://%@", [currentPerson uniqueId]]]];
答案 1 :(得分:1)
可能与你无关,但值得指出,因为我偶然遇到过它。如果你从ABPeoplePicker那里得到了你的人,那就是一个单行。在PeoplePicker中选择此人后,请致电
[myPeoplePicker selectInAddressBook: self];
您可以使用nil
代替self
。
地址簿在该人的页面上启动。
您还可以使用editInAddressBook:
与准备好编辑的人一起启动地址簿。
在我看来,这应该是ABPerson的方法,而不是ABPeoplePicker。