5

私は UINavigationController のサブクラスである ABPeoplePickerNavigationController を使用しています。コンテキストでは、右側のデフォルトのナビゲーション バー ボタン「キャンセル」を使用していますが、意味がありません。無効化または非表示にする方法が見つかりません。使用する方法は、公開され、ストアが承認できる必要があります。ナビゲーション バーを完全に削除する (picker.navigationBarHidden = YES;) こともできますが、連絡先のリストに戻った後にナビゲーション バーが再表示される場合を除きます。ABPeoplePickerNavigationController をサブクラス化し、viewWillAppear をインターセプトして試行し、キャンセル ボタンを nil しても機能しませんでした。[ピッカー set AllowCancel:NO]; DOESは機能しますが、文書化されていないため、承認に合格することはないと思います.

4

10 に答える 10

4

これです

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
  UIView *custom = [[UIView alloc] initWithFrame:CGRectMake(0.0f,0.0f,0.0f,0.0f)]; 
  UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithCustomView:custom]; 
  //UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addAction)]; 
  [viewController.navigationItem setRightBarButtonItem:btn animated:NO]; 
  [btn release]; 
  [custom release]; 
}

完璧に動作します!

于 2010-11-27T22:18:27.930 に答える
2

デリゲートメソッドnavigationController:willShowViewController:animated:を使用したここでの例は機能しますが、独自のナビゲーションアイテムを独自のコントローラーに追加し、指定されたオプションによって、独自のコントローラーに設定したものがすべて削除される場合があります。 。このオプションをうまく機能させるために私がうまく使用したコードは次のとおりです。

- (void)navigationController:(UINavigationController *)navigationController
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated {

    // Here we want to remove the 'Cancel' button, but only if we're showing
    // either of the ABPeoplePickerNavigationController's top two controllers
    if ([navigationController.viewControllers indexOfObject:viewController] <= 1) {

        viewController.navigationItem.rightBarButtonItem = nil;
    }
}

ナビゲーションコントローラーのスタックには、連絡先グループ用と連絡先リスト用の2つのビューコントローラーがあることに注意してください。これが、viewControllerがナビゲーションコントローラーのトップビューコントローラーであるかどうかを確認できない理由です。

于 2011-04-22T17:52:52.513 に答える
0

編集:以下のコメントを参照してください。これは今やるべきでないことの実例です。

ABPeoplePickerNavigationControllerをサブクラス化し、現在のナビゲーションビューコントローラービューを変更するすべてのイベントをインターセプトすることで、パブリックAPIを使用して目的の動作を取得しようとしました。次に、ビュー階層をナビゲートして、不要なボタンをすべて削除できます。

デリゲートからビュー階層をナビゲートすることはできますが、ビューの状態を変更するイベントに精通していません...そのため、[キャンセル]ボタンを強制終了して固定するのは困難です。

このコードは私にとってうまくいきました(注:ブルートフォースはすべての右側のボタンを強制終了します):

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self killCancelButton];
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [super pushViewController:viewController animated:animated];
    [self killCancelButton];
}

- (UIViewController*)popViewControllerAnimated:(BOOL)animated {
    UIViewController *result = [super popViewControllerAnimated:animated];
    [self killCancelButton];
    return result;
}

- (void)killCancelButton {
    for (NSUInteger itemIdx = 0; itemIdx < self.navigationBar.items.count; itemIdx++) {
        UINavigationItem *item = [self.navigationBar.items objectAtIndex:itemIdx];
        item.rightBarButtonItems = [[NSArray alloc] init];
    }
}
于 2012-12-11T00:09:28.537 に答える
0

これに対する答えはありません-キャンセルで生きられない場合は、新しい人のピッカーを書いてください。

于 2010-01-30T13:59:22.627 に答える
0

それは正常に動作しますが、iOS 4 ではもう 1 つ問題があります。アプリの高速切り替え機能を使用してアプリに戻ると、キャンセル ボタンが再び表示されます。

方法

- (void)navigationController:(UINavigationController *)navigationController  
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated

呼び出されません。だから私はこれを作った:

- (void)applicationDidEnterBackground:(UIApplication *)application {
    id topView = pickerControllerDelegate.peoplePicker.topViewController;
    topView.navigationItem.rightBarButtonItem = nil;
}

それはかなりうまくいきます。

于 2010-08-06T18:00:48.450 に答える
0

russel bによると、 viewdidapperを上書きすることができます

これは私のために働いた:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    UINavigationItem *item = (UINavigationItem *)[self.navigationBar.items lastObject];
    item.rightBarButtonItems = [[NSArray alloc] init];

    item.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addPerson)];
}
于 2013-03-08T06:42:56.003 に答える
0

ピッカーのサブビューを参照することで、その結果を得ることができます。ちょっと退屈…

于 2010-03-24T22:22:56.893 に答える
0

ピッカー オブジェクトのデリゲート (peoplePickerDelegate ではなく、デリゲートのみ) を、次のメソッドを実装するクラスに必ず設定してください。

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
UIView *custom = [[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)];
UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithCustomView:custom];
[viewController.navigationItem setRightBarButtonItem:btn animated:NO];
[btn release];
[custom release];
} 
于 2010-07-09T08:03:28.303 に答える
0

まだ試していませんが、isKindOfClass:[UIBarButtonItem class] が見つかるまでピッカーのサブビューを反復処理するように Uby が言っていると思います。その後、その title プロパティを変更できます。また、navigationBar の 'Item' 配列にある場合もあります。

于 2010-06-04T14:28:39.633 に答える
0

PeoplePickerController コントローラーにデリゲートを設定します。デリゲート クラスには、このデリゲート メソッドがあります。

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
 UIView *pCustomView = [[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)];
 UIBarButtonItem *pBtn = [[UIBarButtonItem alloc] initWithCustomView:pCustomView];
 [viewController.navigationItem setRightBarButtonItem:pBtn animated:NO];
 [pBtn release];
 [pCustomView release];
}
于 2010-03-30T09:25:58.110 に答える