1

ナビゲーション コントローラーにビュー コントローラーが埋め込まれています。ボタンとテーブルビューがあります。このView Controllerのテーブルビューにロードするには、電話からの連絡先が必要ですが、連絡先を表示する新しいナビゲーションコントローラーが開かれます。.m ファイルのコードは次のとおりです。

- (IBAction)showContacts:(id)sender
{
    ABPeoplePickerNavigationController *picker =
    [[ABPeoplePickerNavigationController alloc] init];
    picker.peoplePickerDelegate = self; 

   // picker.modalPresentationStyle = UIModalPresentationCurrentContext;
    //picker.modalInPopover = YES;
  //  [self.navigationController presentModalViewController:picker animated:YES];
    [self presentModalViewController:picker animated:YES];
}

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


- (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController *)peoplePicker
      shouldContinueAfterSelectingPerson:(ABRecordRef)person {

    // [self displayPerson:person];
    [self dismissModalViewControllerAnimated:YES];

    return NO;
}

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

これはかなり標準的なコードだと思います。別のコントローラーではなく、ボタンを持つView Controllerのテーブルビューに連絡先を表示するにはどうすればよいですか?

さて、私はこれをやった:

 - (IBAction)syncContacts:(id)sender
    {
        ABAddressBookRef addressBook = ABAddressBookCreate();
        CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
        for (int i = 0; i < ABAddressBookGetPersonCount(addressBook); i++) {
            ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i);
            NSString *contact = (NSString *)CFBridgingRelease(ABRecordCopyCompositeName(ref));
            NSLog( @"%@", contact);
            phoneContacts[i] = contact;
        }
         NSLog(@"%@",phoneContacts);
    }

メソッドの名前を syncContacts に変更しました (便宜上)。NSLog(@"%@",contact) が実行されると、個々の連絡先が取得され、ログに表示されます。しかし、連絡先を phoneContacts 配列 (変更可能) にコピーしているときは、コピーしていません。addObject、insertObject:atIndex:、replaceObjectAtIndex:withObject: などを試しましたが、それでも phoneContacts 配列は null のままです。didViewLoad() で初期化されています。phoneContacts 配列には何も格納されていないため、表ビューも phoneContacts 配列を使用しているため、データが取り込まれていません。

4

4 に答える 4

1

AddressBookUI 経由ではなく、プログラムから AddressBook フレームワークにアクセスする必要があります。次のように、tableView データ ソースをこの結果として設定できます。

ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFMutableArrayRef peopleMutable = CFArrayCreateMutableCopy(
                                          kCFAllocatorDefault,
                                          CFArrayGetCount(people),
                                          people
                                  );

参照: http://developer.apple.com/library/ios/#documentation/ContactData/Conceptual/AddressBookProgrammingGuideforiPhone

于 2013-04-25T15:25:05.903 に答える
0

ボタンを持つView Controllerのテーブルビューに連絡先を表示するにはどうすればよいですか

定義上、ABPeoplePickerNavigationController を使用することはできません。これは、連絡先を表示しているのは新しいビュー コントローラーであるためです。新しいビュー コントローラー = 別のビュー。つまり、これは、組み込みの ABPeoplePickerNavigationController を使用して、多くの作業を自分で行う必要がなくなる代償です。

別の方法は、独自のインターフェイスを発明することです。連絡先データベースを解析し、データを自分で提示する必要があります。それは不可能ではありません。連絡先データベースを解析する方法を説明している私の本のセクションは次のとおりです。

http://www.apeth.com/iOSBook/ch31.html#_address_book_database

しかし正直なところ、ABPeoplePickerNavigationController の使用に伴う妥協を受け入れる必要があると思います。ABPeoplePickerNavigationController が使用したい方法でインターフェイスを調整してください。多くの時間を節約できます。

于 2013-04-25T15:24:02.663 に答える
0

私は自分のView Controller内にABPeoplePickerNavigationControllerのビューを埋め込むことでこれを機能させました:

- (void)embedContactsView {
    self.contactsController = [[ABPeoplePickerNavigationController alloc] init];
    [self.contactsController setPeoplePickerDelegate:self];

    //embed the view
    [self addChildViewController:self.contactsController];
    [self.view addSubview:self.contactsController.view];
    //if your view controller is a navigation controller make sure you
    //hide the nav bar or it will overlap the contacts search.
    [self.navigationController setNavigationBarHidden:YES];
}

連絡先ピッカーのナビゲーション バーを変更することもできます (キャンセル ボタンを非表示にするなど)。

- (void)customiseContactsTabBar { //if this doesn't work be sure to call it in viewDidAppear
    //customise the apple picker a bit
    [self.contactsController.topViewController.navigationItem setTitle:@"Everyone"];
    self.contactsController.topViewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(newButtonPressed)];
}

このアプローチは少しハックですが、別のコントローラーに埋め込むことができるようにするためだけにカスタム連絡先ピッカー全体を実装するよりもはるかに理にかなっています。

于 2014-04-17T13:29:57.897 に答える
-2
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person
{
 [self dismissViewControllerAnimated:NO completion:^{
     ABPersonViewController *personController = [[ABPersonViewController alloc] init];

     [personController setDisplayedPerson:person];
     [personController setPersonViewDelegate:self];
     [personController setAllowsEditing:NO];
     personController.displayedProperties = [NSArray arrayWithObjects:
                                             [NSNumber numberWithInt:kABPersonPhoneProperty],
                                             nil];         
     [self.navigationController pushViewController:personController animated:YES];
 }];
}
于 2014-10-31T13:53:30.140 に答える