ナビゲーションアイテムに右バーのボタンアイテムを追加しましたが、これをある条件で削除したいと考えています。これは私がやっていることです:
self.navigationItem.rightBarButtonItem = nil;
しかし、望ましい動作が得られません。
非表示にしたいのですが、方法がわかりません。
あなたがやっていることはうまくいくはずです。私は何度もやってきた。正しいナビゲーションアイテムからボタンを削除してもよろしいですか? self
は現在表示されているUIViewController
ですか?
私は3つの方法を知っています:(右側にある)
複数のバーボタンがある場合:
_self.navigationItem.rightBarButtonItems = nil
_
それ以外に、バーボタンが1つしかない場合
_self.navigationItem.rightBarButtonItem = nil
_
nilボタンを設定します。self.navigationItem.setRightBarButtonItem(nil, animated: false)
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)
}
新しい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;
私の答えはこの質問に特に関係していませんが、これはグーグルでの最高の結果なので、問題の経験を貢献します
RightBarButtonItemに項目の配列を使用していたため、どういうわけか
self.navigationItem.rightBarButtonItem = nil;
私のために機能していなかったので、空のバーボタンアイテムを作成し、それを使用してrightBarButtonItemとして設定しました
[self.navigationItem setRightBarButtonItems:@[self.clearRightButtonItem]];
そして今ではなくなった。
最近、私は同じ問題に直面していて解決しました(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];
}
}
その他の場合:私も試しました
self.navigationItem.rightBarButtonItem = nil;
それが機能しなかった場合、mainスレッドから呼び出していないことに気づきました。
if let nav = self.navigationController {
nav.navigationItem.setRightBarButtonItems(nil, animated: true)
nav.navigationBar.topItem?.rightBarButtonItems = []
}
実際にナビゲーションコントローラーに埋め込まれていないビューコントローラーにナビゲーションバーを追加すると、この問題が発生しました。その場合、self.navigationItemは、バーボタンを保持するための適切なオブジェクトではありません。私が見つけたのは(おそらく、viewcontrollerをナビゲーションコントローラーに埋め込むべきですが)インターフェースビルダーで追加したナビゲーションバーのプロパティを作成し、通常どおりにリンクすることです。この場合、「navBar」という名前を付けました。
次に、ビューのナビゲーション項目の代わりにnavBarのナビゲーション項目を取得する必要があります。その場合、このコードは機能するようです:
UINavigationItem *item = [self.navBar.items objectAtIndex:0];
item.rightBarButtonItem = nil;
それは私のために次のコードでうまくいきました:
self.navigationItem?.rightBarButtonItem = nil
navigationBar.items = [self.navigationItem!]