11

何週間も解決策を探しているので、私は絶望に近づいています。

問題は単純です:

  • ABPeoplePickerNavigationController (ModalView として) を介して、人物を選択する必要があります。
  • 次に、(たとえば) メール アドレスのみが表示され、ユーザーはいずれかを選択する必要があります。
  • メール アドレスを選択すると、(例) 電話番号だけが表示され、ユーザーは 1 つを選択する必要があります。

3番目の側面までの解決策はよく知られています:

- (IBAction)importFromAddressBook 
{
    ABPeoplePickerNavigationController* picker = [[ABPeoplePickerNavigationController alloc] init];
    picker.peoplePickerDelegate = self;
    [self presentModalViewController:picker animated:YES];
    [picker release];
}

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker 
{
    [self dismissModalViewControllerAnimated:YES];
}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker 
      shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{
    [peoplePicker setDisplayedProperties:[NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonEmailProperty]]];
    return YES;
}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
      shouldContinueAfterSelectingPerson:(ABRecordRef)person
                                property:(ABPropertyID)property
                              identifier:(ABMultiValueIdentifier)identifier 
{
    //===PROBLEM=== Now I do have a mail address and I want to have a phone number right afterwards.

    //Something like this would be straightforward, but the view does not change this way:
    [peoplePicker setDisplayedProperties:[NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]]];
    //Here misses the important code.


    //And only when I also got a phone number through this or a similar method I want to call:
    [peoplePicker dismissModalViewControllerAnimated:YES];

    //I do not want to start default behaviour with the mailaddress and/or phone number:
    return NO;
}

正しいアプローチは、ModalView の NavigationController に同様の peoplePicker View をプッシュするようですが、方法がわかりません。

誰かが何か考えていたら、それは素晴らしいことです!

このような動作を確認したい場合は、Amazon アプリをご覧ください: 注文の最初のステップを実行する場合は、次の方法で配送先住所を選択できます: 連絡先リストから -> 人を選択 ->住所を選択 -> 電話番号を選択します。そこでは、上に示した標準コードよりも 1 つ多いレベルのナビゲーション階層を持つモーダル ビューですべてが行われているようです。

4

4 に答える 4

15

私はこれがあなたが望むものかもしれないと思います:

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

    ABPersonViewController *controller = [[ABPersonViewController alloc] init];
    controller.displayedPerson = person;
    controller.displayedProperties = [NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]];
    controller.personViewDelegate = self;
    [peoplePicker pushViewController:controller animated:YES];
    [controller release];
    return NO;
}

- (BOOL)personViewController:(ABPersonViewController *)personViewController 
shouldPerformDefaultActionForPerson:(ABRecordRef)person 
                    property:(ABPropertyID)property
                  identifier:(ABMultiValueIdentifier)identifierForValue
{
    ABMutableMultiValueRef multi = ABRecordCopyValue(person, property);
    CFStringRef phone = ABMultiValueCopyValueAtIndex(multi, identifierForValue);
    NSLog(@"phone %@", (NSString *)phone);
    CFRelease(phone);

    ABPeoplePickerNavigationController *peoplePicker = (ABPeoplePickerNavigationController *)personViewController.navigationController;
    [peoplePicker dismissModalViewControllerAnimated:YES];
    return NO;
}

ABPeoplePickerNavigationControllerはNSPeoplePickerNavigationControllerのサブクラスであるため、別のABPersonViewControllerインスタンスを作成し、ユーザーがそれをプッシュできるようにするという考え方です。

于 2010-03-16T20:54:05.250 に答える
1

次のメソッドは NO を返す必要があります。

- (BOOL)peoplePickerNavigationController: 
  (ABPeoplePickerNavigationController*)peoplePicker 
  shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{
  ...
  return NO;
}

これにより、次のメソッドを呼び出すことができます (peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:)。

于 2010-07-20T15:16:22.360 に答える
1

私の iPhone アプリ Pasteie では、別のアプローチを取りました。(出典:manicwave.com代替テキスト

peoplePicker を使用して人を選択し、連絡先 (人) エディターを開きます。

これは単純なビューです。

連絡先名 電話番号 > デフォルトで最初の電話番号 メールアドレス > デフォルトで最初のメールアドレス

電話番号と電子メール アドレスのそれぞれが、現在選択されているものの横にチェック マークが付いた、電話または電子メール アドレスのリストを示す別のビューを表示します。

このビューは、連絡先の初期設定とその後の編集に使用します。

于 2010-02-28T04:45:48.497 に答える
1

提案された回答には、リリースがありません

CFRelease(マルチ);

このリリースがないと、リークが発生します。または、少なくとも Build and Analyze in Xcode によると....

于 2010-05-22T07:59:22.623 に答える