2時間ほど悩んだ。ABPeoplePickerNavigationControllerは先に初期化しておこう。

どうでもいいというか、同じ現象に悩んでいるひとはほとんどいないと思うことで、2時間ほど悩んでいました。

連絡先の情報にアクセスしたくて、Appleが用意している簡易なUIであるABPeoplePickerNavigationControllerを使いました。

このABPeoplePickerNavigationControllerで、電話番号やメールアドレスなど表示したい内容を指定するdisplayedPropertiesというプロパティがあります。

ここに、それぞれの表示したい要素に対応したint型の数値をNSNumberでラップして、配列として渡します。

そのときに、先にプロパティを作ってあとでABPeoplePickerNavigationControllerを呼び出すようにして、プロパティは呼ぶメソッドによって変更するような設計にしていたのですが、何故か起動後毎回1度だけ、何も表示されない状態になっていました。

// このコードだとバグになる。
- (void)showAddressBook{
    // ABPeoplePickerNavigationControllerの初期化より先に、先にkABEmailPropertyやkABPhonePropertyを使う。
    NSArray *properties = @[@(kABPersonEmailProperty),@(kABPersonPhoneProperty)];

    ABPeoplePickerNavigationController *apnvc = [ABPeoplePickerNavigationController new];

    apnvc.displayedProperties = properties;

    [self presentViewController:apnvc animated:YES completion:nil]; 

}

2回目以降は、ちゃんと指定した表示内容が表れるのですが、最初だけ表示されないのがほんとに謎でした。

きっとバグだと思っていたのですが、どうやらぼくがこのAPIを上手く使いこなせていないだけでした。

ぼくは、int型の数値を定数から取得するようにしていて、kABPersonEmailPropertyなどの定数を呼んでいます。

これを使う場合は、ABPeoplePickerNavigationControllerを先に呼び出して、初期化しておかなければならないようなのです。

つまり、

// これでいい
- (void)showAddressBook{

    // NSArray *properties = @[@(kABPersonEmailProperty),@(kABPersonPhoneProperty)];

    ABPeoplePickerNavigationController *apnvc = [ABPeoplePickerNavigationController new];

    NSArray *properties = @[@(kABEmailProperty),@(kABPhoneProperty)];
    apnvc.displayedProperties = properties;

    [self presentViewController:apnvc animated:YES completion:nil]; 

}

そうすることで、kABPersonEmailPropertyなどにちゃんと数値が入った状態となるようで、この仕様に気がつくまで結構時間を食ってしまいました。

別のメソッドから、表示したいpropertyを渡してABPeoplePickerNavigationControllerを初期化するようにしていたのですが、ダメだったようです。
そこで引っかかってしまいました。

呆気なく解決したのですが同じ内容で困る人がいないように、メモを残しておきます。

これからも更新を続けていきますので、Feedlyへの登録をお願いします!

follow us in feedly

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です