2009-06-04 44 views
1

ABPeoplePickerNavigationControllerをユーザーに提示し、連絡先を選択するように依頼しています。ユーザーを選択すると、そのユーザーが選択したプロパティに応じて、メッセージアプリまたはメールアプリのいずれかに送信されます。しかし、私はモーダルピッカーが解除された後に発生するアクションをカスタマイズする方法を理解できません。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は無効です。 選択した電話番号のSMS /メッセージングアプリを起動するには、SMS:// ... //が鍵です! ドキュメントはのsms:を正しいフォーマットとして示していますが、間違っていることがわかりました。

0

2つのメソッド(たとえばpickedPhoneとpickedMail)でカスタムプロトコルを作成し、これを呼び出すクラスにこれらのルーチンを実装させ、自身をデリゲートとして割り当てることができます。決定が下されると、デリゲートが定義されているかどうかを確認し、適切なメソッドを呼び出して、呼び出し元に処理をさせます。

また、あなたは「SMS」のURLにいくつかのテストを行う必要があります。最後に、SMSアプリを実行したが、何も渡していないことを確認した。

しかし、そこに着く前に、外部の電話または電子メールアプリを呼び出すためにopenURLを呼び出すと、アプリが停止し、コントロールがそれらのアプリに転送されます。だから私はあなたのアプリがもはや周りにはないので、ユーザーがモーダルピッカーを却下した後に何が起こるか気にしない。

今OS 3.0の下で、あなたはいくつかのオプションを持っているかもしれないが、まだ...あなたは、問題を再検討することをお勧めします。

+0

のために同じ機能でコードを書きます。私は開かれた電子メールをカスタマイズするためにプロパティ選択を傍受しようとしています。利便性の問題として、ユーザーの主体を設定することができます。また、電話番号を選択すると、電話アプリではなくSMSアプリが表示されます。したがって、私はそれを傍受し、適切なopenURLを呼び出す必要があります。 – Georges

2

あなたは(あなたが選択したプロパティを処理する必要がある場合を除き)単純にYESを返す実装ではデリゲートメソッド

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

を実装するために単に必要があります。その後、ユーザーが電話番号に触れた場合、アプリはその電話番号で電話を開始します。同様に、ユーザーが電子メールアドレスに触れた場合、youtアプリはデフォルトのメール作成ビューに切り替わります。

そうmthodが呼び出されることはありません、デリゲートとして自分自身を割り当てることを忘れないでください:

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

そして最後に、あなたのコントローラのヘッダファイルのプロトコルセクションにABPeoplePickerNavigationControllerDelegateを置きます。

注:あなたがいないシミュレータ上で、デバイス上でこれをテストする必要があります。

+0

お返事ありがとうございます。 私が実装する方法は、PeoplePickerプロトコルではなく、ABPersonViewControllerDelegateプロトコルに実装されているため、ちょっと混乱します。 コントローラをABPeoplePickerNavigationControllerのデリゲートとして設定していて、これらのメソッドが正しく呼び出されていますが、ABPersonViewControllerデリゲートメソッドが呼び出されることはありません。 ABPeoplePickerNavigationControllerによってインスタンス化されているABPersonViewControllersの代理人として自分のコントローラを設定していないためです。 これを設定する方法は分かりますか? – Georges

+0

ユーザーが連絡先を選択すると、ABPersonViewControllerをinit/allocするだけで、その代理人とその人物(ユーザーが選択した連絡先)が設定され、 がスタックにプッシュされます。その後、電話番号または電子メールアドレスをクリックすると、デフォルトのアクションがトリガーされます。 –

0

ちょうど私は私のアプリは、コントロールを失うことになることを承知していますNO/

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

でFALSE /偽を返すと接触処理

関連する問題