3

次のコードは iOS7 では正しく動作しますが、iOS8 では動作しません (変数recordIDが正しく設定されています)。

    CFErrorRef error = nil;
    const ABAddressBookRef addressBook = (ABAddressBookCreateWithOptions (NULL, &error));
    ABRecordRef contactRef = ABAddressBookGetPersonWithRecordID (addressBook, recordID);
    ABPersonViewController *personViewController = [[ABPersonViewController alloc] init];
    personViewController.addressBook     = addressBook;
    personViewController.displayedPerson = contactRef;
    CFRelease(addressBook);
    NSArray *displayedProperties = @[@(kABPersonFirstNameProperty),
                                     @(kABPersonLastNameProperty),
                                     @(kABPersonMiddleNameProperty),
                                     @(kABPersonPrefixProperty),
                                     @(kABPersonSuffixProperty),
                                     @(kABPersonOrganizationProperty),
                                     @(kABPersonJobTitleProperty),
                                     @(kABPersonDepartmentProperty),
                                     @(kABPersonEmailProperty),
                                     @(kABPersonBirthdayProperty),
                                     @(kABPersonKindProperty),
                                     @(kABPersonAddressProperty),
                                     @(kABPersonPhoneProperty),
                                     @(kABPersonInstantMessageProperty),
                                     @(kABPersonURLProperty),
                                     @(kABPersonSocialProfileProperty),
                                     @(kABPersonNoteProperty)];
    personViewController.displayedProperties  = displayedProperties;
    personViewController.navigationItem.title = NSLocalizedString(@"CONTACT_DETAILS", nil);
    personViewController.allowsActions        = YES;
    personViewController.allowsEditing        = YES; // if NO, no back button is shown
    personViewController.personViewDelegate   = self;
    personViewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"ADDRESSES",nil) style:UIBarButtonItemStylePlain target:self action:@selector(personviewDoneButtonPressed:)];

    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:personViewController];
    [self presentViewController:navigationController animated:YES completion:nil];

iOS8 のバグ:

  1. をにallowsEditing設定するYESと、連絡先は 表示されますが、名前のみが表示されます。ナビゲーション バーには、左側に [戻る] ボタン ("Addresses" という名前)、右側に編集ボタンが表示されます。編集ボタンを押すと、 name 以外のすべてのフィールドが空の連絡先が表示され、編集ボタンが完了ボタンとして表示されます。前に編集せずにこの完了ボタンを押すと、連絡先に関するすべての情報が表示されます。
  2. をにallowsEditing設定するNOと、戻るボタンが表示されなくなり、画面を離れることができなくなります。

誰にも回避策はありますか?

アップデート:

私は今、問題1がシミュレーターでのみ発生することに気付きましたが、常に私のデバイスで発生します。

4

2 に答える 2

0

更新: このハックは機能しなくなり、まったく役に立たなくなりました (私の新しい回答を参照してください)。

誰かが上記の 1) と同じ問題を抱えている場合、Apple がバグを修正するまでの非常に厄介な回避策があります (私のバグレポートはまだ開いています):特定の状況では、画面が表示され
た後に編集ボタンを 2 回切り替える必要があるため、ABPersonViewControllerプログラムでこれを行うことができます:

を表す のプロパティを定義しUINavigationControllerますABPersoViewController

@property (nonatomic, strong) UINavigationController *  navigationControllerForPersonViewController;

ナビゲーション コントローラーが person ビュー コントローラーを表示したら、セレクターを実行してトグルを行います。

[self performSelector:@selector(toggleEditButton) withObject:nil afterDelay:0.7];  

Person View Controller画面がアニメーションで表示されるように、遅延が設定されています。メソッドtoggleEditButtonは次のように定義されます。

- (void)toggleEditButton
{
    UIBarButtonItem *editButton  = self.navigationControllerForPersonViewController.topViewController.navigationItem.rightBarButtonItem;
    id target = editButton.target;
    SEL editAction = editButton.action;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    [target performSelector:editAction withObject:editButton];
    [target performSelector:editAction withObject:editButton];
#pragma clang diagnostic pop
}

#pragma は、メモリ リークの可能性に関するコンパイラの警告を抑制するために必要です。
その結果、Person View Controller の選択されたすべての情報が実際に表示されます。

于 2014-10-18T09:28:50.363 に答える