2009-06-04 48 views
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; 
} 

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

回答

0

已解决。 问题不在委托方法中。那是我创建的NSURL是无效的。 要与选择的电话号码启动短信/邮件的应用程序,用户短信:// ...的//是关键! 该文档似乎表明短信:作为正确的格式,但我发现这是不正确的。

0

您可以创建一个有两个方法(比如,pickedPhone和pickedMail)自定义协议,并有类调用此一个执行这些程序,并指定自己为委托。一旦做出决定,就检查委托是否被定义,然后调用正确的方法,并让调用者处理如何处理它。

此外,你应该做的“SMS” URL一些测试。最后我检查它运行短信应用程序,但没有传递任何信息。

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

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

+0

我知道我的应用程序将失去控制。我试图拦截财产选择,以定制打开的电子邮件。为方便起见,我可以为用户设置主题/正文。另外,如果他们选择电话号码,我希望短信应用显示出来,而不是电话应用。因此,我需要拦截它,然后调用相应的openURL。 – Georges 2009-06-05 15:25:51

2

你需要简单地实现委托方法

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

在实现仅仅是返回(除非你需要选择的物业处理)。然后,如果用户触摸了电话号码,则您的应用将开始拨打该电话号码。同样,如果用户触摸了电子邮件地址,您的应用程序将切换到默认的撰写电子邮件视图。

不要忘了给自己分配为代表,否则mthod将不会被调用:

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

最后,把ABPeoplePickerNavigationControllerDelegate在你的控制器的头文件的协议部分。

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

+0

感谢您的回复。 虽然我有点困惑,因为您建议我实现的方法是在ABPersonViewControllerDelegate协议中,而不是PeoplePicker协议。 我已经将我的控制器设置为ABPeoplePickerNavigationController的委托,并且这些方法被正确调用,但ABPersonViewController委托方法永远不会被调用。我认为这是因为我没有将我的控制器设置为由ABPeoplePickerNavigationController实例化的ABPersonViewController的委托。 你知道如何设置? – Georges 2009-06-05 15:40:53

0

只返回NO/FALSE /假的

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

写在同一功能的代码为接触性加工