1

我正在向用户展示一个 ABPeoplePickerNavigationController 并要求他们选择一个联系人。一旦他们选择了一个用户,我想让他们发送到消息应用程序或电子邮件应用程序,具体取决于他们选择的属性。但是,我不知道如何自定义模式选择器被解除后发生的操作。

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
    if(property == kABPersonPhoneProperty){
        [self dismissModalViewControllerAnimated:YES];
        NSString* phoneNumber = (NSString *)ABRecordCopyValue(person, property);
        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"sms:%@", phoneNumber]];
        [[UIApplication sharedApplication] openURL:url];
        [phoneNumber release];
        return NO;
    }

    if(property == kABPersonEmailProperty){
        [self dismissModalViewControllerAnimated:YES];
        NSString* emailAddress = (NSString *)ABRecordCopyValue(person, property);
        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"mailto:%@", emailAddress]];
        [[UIApplication sharedApplication] openURL:url];
        [emailAddress release];
        return NO;
    }
    return YES;
}

那么,我该怎么做呢?谢谢!

4

4 回答 4

2

您只需要实现委托方法

   - (BOOL)personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue

在实现中只需返回 YES(除非您需要处理选定的属性)。然后,如果用户触摸了一个电话号码,您的应用将开始拨打该电话号码。同样,如果用户触摸了一个电子邮件地址,您的应用程序将切换到默认的撰写电子邮件视图。

不要忘记将自己指定为委托,否则将不会调用该方法:

ABPeoplePickerNavigationController *peoplePicker = [[ABPeoplePickerNavigationController alloc] init];
peoplePicker.peoplePickerDelegate = self;
[self presentModalViewController:peoplePicker animated:YES];

最后,将 ABPeoplePickerNavigationControllerDelegate 放入控制器头文件的协议部分。

注意:你应该在设备上测试这个,而不是在模拟器上。

于 2009-06-05T11:12:42.933 回答
0

您可以使用两种方法(例如,pickPhone 和pickMail)创建一个自定义协议,并让调用该方法的类实现这些例程并将自己指定为委托。一旦做出决定,您检查是否定义了委托,然后调用正确的方法并让调用者处理如何处理它。

此外,您应该对“短信”网址进行一些测试。最后我检查了它运行 SMS 应用程序但没有传递任何东西给它。

但是在你到达那里之前,你现在通过调用那些 openURL 来调用外部电话或电子邮件应用程序的方式,你的应用程序将被停止并且控制将被转移到这些应用程序。所以我不确定你为什么关心用户关闭模式选择器后会发生什么,因为你的应用程序将不再存在。

现在在 OS 3.0 下您可能有一些选择,但仍然……您可能需要重新考虑这个问题。

于 2009-06-05T06:03:13.500 回答
0

解决了。问题不在于委托方法。那是我创建的 NSURL 无效。要使用选定的电话号码启动 SMS/Messaging 应用程序,用户sms:// ... //是关键!文档似乎表明sms:是正确的格式,但我发现这是不正确的。

于 2009-06-05T17:44:57.947 回答
0

只需返回 NO/FALSE/false

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
      shouldContinueAfterSelectingPerson:(ABRecordRef)person
                                property:(ABPropertyID)property
                              identifier:(ABMultiValueIdentifier)identifier

并在相同的函数中编写代码以进行联系人处理

于 2012-01-13T09:45:00.110 回答