0

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 になることです。

ABAccountsAndGroupsViewControllerABMembersViewControllerは AddressBookUI のパブリック API ではないため、直接アクセスすることはできません (名前を出力して取得しました)。そのため、代わりに viewControllers のカウントを確認します。では、私の最初の質問は、なぜ Apple はそれらを public API にしないのですか?

2 番目の質問は、ABPersonViewController (ケース 3) に関するものです。ABNewPersonViewController の場合、その navigationItem は「キャンセル」と「完了」のUIBarButtonItem を正しく表示できます。私はそこで何もする必要はありません。

しかし、それが ABPersonViewController の場合、「キャンセル」UIBarButtonItem は編集ボタンではなく rightBarButtonItem として表示されます (allowsEditing を YES に設定しても)。そのため、手動で設定する必要があります。しかし、なぜ ??それを行うより良い方法はありますか?

ABPeoplePickerNavigationController を Contact App のように機能させるために、ここに書いたコードよりも良い方法はありますか?

ありがとう!

4

1 に答える 1

0

iOS 5 にアップグレードした後、コードを修正する必要があることがわかりました。ABPeoplePickerNavigationController が ABAccountsAndGroupsViewController を表示する場合 (ケース 1)、これらは左側の更新バー ボタンになります。それが Exchange サーバーから連絡先を同期するために使用されるのか、それともどのようなアクションがトリガーされるのかわかりません。

しかし、デフォルトのボタンを独自の更新ボタンに置​​き換えると、アクションは呼び出されません! そして、それは ABAccountsAndGroupsViewController でのみ発生し、他のケースでも機能することがわかりました!

私のコードを iOS 5 で動作させるには、デリゲート メソッドdidShowViewController NOT willShowViewControllerを実装する必要があります。

于 2011-11-10T03:31:06.743 に答える