【问题标题】:Custom action after ABPeoplePickerNavigationController is dismissedABPeoplePickerNavigationController 被解除后的自定义操作
【发布时间】:2009-06-04 19:45:21
【问题描述】:

我正在向用户展示一个 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;
}

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

【问题讨论】:

    标签: iphone uinavigationcontroller sms


    【解决方案1】:

    你只需要实现委托方法

       - (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 放入控制器头文件的协议部分。

    注意:您应该在设备上进行测试,而不是在模拟器上。

    【讨论】:

    • 感谢您的回复。不过,我有点困惑,因为您建议我实现的方法是 ABPersonViewControllerDelegate 协议,而不是 PeoplePicker 协议。我已将我的控制器设置为 ABPeoplePickerNavigationController 的委托,并且这些方法被正确调用,但 ABPersonViewController 委托方法永远不会被调用。我认为这是因为我没有将控制器设置为由 ABPeoplePickerNavigationController 实例化的 ABPersonViewControllers 的委托。你知道怎么设置吗?
    • 一旦用户选择了一个联系人,您只需要初始化/分配一个 ABPersonViewController 设置它的代表和要显示的人员(您的用户选择的联系人),然后将其推送到堆栈上。然后,当点击电话号码或电子邮件地址时,将触发默认操作。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我知道我的应用程序将失去控制。我正在尝试拦截属性选择以自定义打开的电子邮件。为方便起见,我可以为用户设置主题/正文。此外,如果他们选择电话号码,我希望显示 SMS 应用程序,而不是电话应用程序。因此,我需要拦截它,然后调用相应的 openURL。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      只返回 NO/FALSE/false

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多