web-dev-qa-db-ja.com

ナビゲーション項目から右バーボタン項目を削除する

ナビゲーションアイテムに右バーのボタンアイテムを追加しましたが、これをある条件で削除したいと考えています。これは私がやっていることです:

self.navigationItem.rightBarButtonItem = nil;

しかし、望ましい動作が得られません。

非表示にしたいのですが、方法がわかりません。

26
Abhinav

あなたがやっていることはうまくいくはずです。私は何度もやってきた。正しいナビゲーションアイテムからボタンを削除してもよろしいですか? selfは現在表示されているUIViewControllerですか?

18
Erik B

私は3つの方法を知っています:(右側にある)

  1. 複数のバーボタンがある場合:
    _self.navigationItem.rightBarButtonItems = nil_

  2. それ以外に、バーボタンが1つしかない場合
    _self.navigationItem.rightBarButtonItem = nil_

  3. nilボタンを設定します。
    self.navigationItem.setRightBarButtonItem(nil, animated: false)

8
Jirson Tavera

Swift 5/4/-ナビゲーションバーの左側と右側にいくつかのボタンがあるため、次のようにして非表示にします。

func hideNavItems() {
  navigationItem.setLeftBarButtonItems(nil, animated: true)
  navigationItem.setRightBarButtonItems(nil, animated: true)
}

私の場合、実際には後でこれらのボタンを再度表示する必要があるので、それらを配列に保持します。

var leftNavItems: [UIBarButtonItem]!
var rightNavItems: [UIBarButtonItem]!

次に、関数を呼び出してそれらを表示(再追加)します。

func showNavItems() {
  navigationItem.setLeftBarButtonItems(leftNavItems, animated: true)
  navigationItem.setRightBarButtonItems(rightNavItems, animated: true)
}
7
budidino

新しいrightBarButtonItemを作成して解決しました。

プロパティを作成:

@property (nonatomic, strong) UIBarButtonItem *clearRightButtonItem;

合成:

@synthesize clearRightButtonItem = _clearRightButtonItem;

ゲッターを作成します。

- (UIBarButtonItem *) clearRightButtonItem {
    if (_clearRightButtonItem == nil) {
        UIButton *rightButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 38, 38)];
        [rightButton setImage:nil forState:UIControlStateNormal];
        _clearRightButtonItem = [[UIBarButtonItem alloc] initWithCustomView:rightButton];
    }
    return _clearRightButtonItem;
}

次に、rightBarButtonItemに新しいclearRightButtonItemを設定します。

self.rightButtonItem = self.clearRightButtonItem;
2
edzio27

私の答えはこの質問に特に関係していませんが、これはグーグルでの最高の結果なので、問題の経験を貢献します

RightBarButtonItemに項目の配列を使用していたため、どういうわけか

    self.navigationItem.rightBarButtonItem = nil;

私のために機能していなかったので、空のバーボタンアイテムを作成し、それを使用してrightBarButtonItemとして設定しました

    [self.navigationItem setRightBarButtonItems:@[self.clearRightButtonItem]];

そして今ではなくなった。

1
Abhinav Singh

最近、私は同じ問題に直面していて解決しました(Erik Bのおかげで、あなたの回答が私に影響を与えました!残念ながら、まだあなたの回答には投票できません)

右のバーボタンはviewWillAppear関数で呼び出したため消えることはないと思います。その関数では、selfは現在のUIViewControllerを参照していません。

これは私にとってはうまくいきましたが、viewWillAppearにボタンを設定する代わりに、navigationController:willShowViewController:animated:関数のpreviousUIViewControllerに設定しました。

たとえば、SecondViewControllerからFirstViewControllerを呼び出し、SecondViewControllerの右バーボタンを非表示にしたい場合は、これをFirstViewController.mに入れます。

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if ([viewController isKindOfClass:[SecondViewController class]]) {
        [viewController.navigationItem setRightBarButtonItem:nil];
    }
}
1
algazel

その他の場合:私も試しました

self.navigationItem.rightBarButtonItem = nil;

それが機能しなかった場合、mainスレッドから呼び出していないことに気づきました。

0
user1105951

スウィフト3/4:

if let nav = self.navigationController {
   nav.navigationItem.setRightBarButtonItems(nil, animated: true)
   nav.navigationBar.topItem?.rightBarButtonItems = []
}
0

実際にナビゲーションコントローラーに埋め込まれていないビューコントローラーにナビゲーションバーを追加すると、この問題が発生しました。その場合、self.navigationItemは、バーボタンを保持するための適切なオブジェクトではありません。私が見つけたのは(おそらく、viewcontrollerをナビゲーションコントローラーに埋め込むべきですが)インターフェースビルダーで追加したナビゲーションバーのプロパティを作成し、通常どおりにリンクすることです。この場合、「navBar」という名前を付けました。

次に、ビューのナビゲーション項目の代わりにnavBarのナビゲーション項目を取得する必要があります。その場合、このコードは機能するようです:

UINavigationItem *item = [self.navBar.items objectAtIndex:0];
item.rightBarButtonItem = nil;
0
Jake Hargus

それは私のために次のコードでうまくいきました:

self.navigationItem?.rightBarButtonItem = nil
navigationBar.items = [self.navigationItem!]
0
sahiljain