2009-06-04 34 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 

寫在同一功能的代碼爲接觸性加工