2009-10-23 8 views
5

私はUINavigationControllerのサブクラスであるABPeoplePickerNavigationControllerを使用しています。コンテキストでは、右側のデフォルトのナビゲーションバーボタン「キャンセル」は意味をなさないものです。私はそれを無効にするか隠す方法を見つけ出すことができず、どのような方法を公開し、店で承認する必要があります。 ナビゲーションバーが完全になくなる(picker.navigationBarHidden = YES;)ことは、ナビゲーションバーが再び表示される連絡先のリストにポップバックした後を除いて、オプションになる可能性があります。 ABPeoplePickerNavigationControllerをサブクラス化して、キャンセルしようとするviewWillAppearを傍受します。キャンセルボタンが機能しませんでした。 [picker setAllowsCancel:NO];動作しますが、文書化されていませんので、承認を得ることは決してありません。ABPeoplePickerNavigationController - プライベートメソッド/プロパティを使用せずに[キャンセル]ボタンを削除しますか?

+0

してみてください、このhttps://gist.github.com/2970980 –

+0

これは役立つかもしれませんhttp://www.scott-sherwood.com/ios5-removing-the-cancel-button-on-abpeoplepickernavigationcontroller/ – c0d3Junk13

+0

私は同じ問題に立ち往生しています、そして、ちょうどこれがAppleによって絶対嘲笑であると言いたいと思います。はい、setAllowsCancelまたはsetAllowsCardEditingを使用すると、アプリケーションが拒否されます。 – c0d3Junk13

答えて

0

これには答えはありません。取り消しに同行できない場合は、新しい人物ピッカーを作成してください。

+0

あなたは単に "人の選択"を書くことはできません - あなたはアドレス帳の許可を求める必要があります。 Appleのデフォルトのピッカーはシステム権限を必要としません。 – Zorayr

0

この結果は、ピッカーのサブビューで参照できます。ちょっと退屈です...

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]; 
} 
0

私はまだ試していないが、私はUbyはあなたがisKindOfClassあるものを見つけるまで、ピッカーのサブビューを反復処理するために言っていると思う:[UIBarButtonItemクラス]、その後、あなたはそれがタイトルプロパティの変更することができます。また、navigationBarの 'Item'配列内にあることもあります。

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]; 
} 
0

それが正常に動作しますが、iOSの4中1つのより多くの事があります。 Fast App Switching機能を使用して自分のアプリに戻ると、キャンセルボタンが再度表示されます。

方法

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

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

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

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

4

この1

- (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]; 
} 

完璧な作品!

2

デリゲートメソッドnavigationController:willShowViewController:animated:を使用した例ここでは、独自のナビゲーション項目を独自のコントローラに追加したい場合があります。あなた自身のコントローラーで。 2つのビューコントローラがナビゲーションコントローラのスタックであること

- (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; 
    } 
} 

ノート、コンタクトグループや連絡先リストのいずれかの1:ここで私が正常にうまく機能するには、このオプションを取得するために使用したコードです。これは、単にviewControllerがナビゲーションコントローラのトップビューコントローラであることを確認できない理由です。

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]; 
    } 
} 
+0

ところで、あなたは正しいよviewWillAppear :(BOOL)はうまくいかなかった。私はビューが既に生きている後にkillCancelButtonを起動しなければなりませんでした。私のiPhone 4では不思議そうに見えませんが、古いデバイスや遅いデバイスでは面白く見えるかもしれません。 –

+0

ABPeoplePickerNavigationControllerがモーダルとして表示されると、キャンセルボタンでアニメーションが生成されるため、問題が発生します。停止した場合にのみ、ボタンが削除されます。アー。 – n13

+0

アドレス帳のフレームワークからモデルデータを取得して自分のビュー/コントローラを構築しましたが、これは上記のように不吉な結果を招いたためです。私は誰もが暴力的な安心感を誤解していないことを願っています。 –

0

あなただけ上書きする可能性が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)]; 
} 
関連する問題