ABPeoplePickerNavigationController を Contact App のように機能させようとしていますが、複雑すぎることがわかりました。これは私が間違ったことをしたからなのか、それともただのやり方なのかはわかりません。
最初のタスクは、右バー ボタンの [キャンセル] ボタンを取り除くことです。次のコードは機能しません!
picker.navigationItem.rightBarButtonItem = nil;
私はしばらく混乱していましたが、Cancel rightBarButtonItem がサブビュー ABPeoplePickerNavigationController に属しているためであることがわかりました。そして、これが理由です。picker.navigationItem.rightBarButtonItem を出力するだけで、常に nil であることを確認するのは簡単です。
そこで、ABPeoplePickerNavigationController.delegate (peoplePickerDelegate ではない) を実装します。しかし、それを実装するにはかなりのトリックが必要でした。それが私の質問です。
したがって、最初にコーディングします。
#pragma mark UINavigationControllerDelegate methods
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
switch ([navigationController.viewControllers count]) {
case 1:
viewController.navigationItem.rightBarButtonItem = nil;
break;
case 2: {
UIBarButtonItem *addButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addButtonClicked)];
[viewController.navigationItem setRightBarButtonItem:addButtonItem animated:NO];
[addButtonItem release];
break;
}
case 3: {
UIBarButtonItem *editButtonItem;
if ([viewController isKindOfClass:[ABPersonViewController class]]) {
editButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(editButtonClicked:)];
self.personView = (ABPersonViewController*) viewController;
self.personView.allowsEditing = YES;
[viewController.navigationItem setRightBarButtonItem:editButtonItem animated:NO];
[editButtonItem release];
} else {
//ABPersonNewViewController
//No need to add codes here
}
break;
}
default: {
UIBarButtonItem *cancelButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(addButtonClicked)];
[viewController.navigationItem setRightBarButtonItem:cancelButtonItem animated:NO];
[cancelButtonItem release];
break;
}
}
}
ここで最初に奇妙な点は、ABPeoplePickerNavigationController に 1 つまたは 2 つのサブビューしか含まれていない場合、ケース 1 とケース 2 の場合、viewController はそれぞれ ABAccountsAndGroupsViewController、ABMembersViewController になることです。
ABAccountsAndGroupsViewControllerとABMembersViewControllerは AddressBookUI のパブリック API ではないため、直接アクセスすることはできません (名前を出力して取得しました)。そのため、代わりに viewControllers のカウントを確認します。では、私の最初の質問は、なぜ Apple はそれらを public API にしないのですか?
2 番目の質問は、ABPersonViewController (ケース 3) に関するものです。ABNewPersonViewController の場合、その navigationItem は「キャンセル」と「完了」のUIBarButtonItem を正しく表示できます。私はそこで何もする必要はありません。
しかし、それが ABPersonViewController の場合、「キャンセル」UIBarButtonItem は編集ボタンではなく rightBarButtonItem として表示されます (allowsEditing を YES に設定しても)。そのため、手動で設定する必要があります。しかし、なぜ ??それを行うより良い方法はありますか?
ABPeoplePickerNavigationController を Contact App のように機能させるために、ここに書いたコードよりも良い方法はありますか?
ありがとう!