web-dev-qa-db-ja.com

ナビゲーションバーの右ボタンを非表示/表示する方法

ナビゲーションバーの右ボタンを非表示にし、ユーザーがいくつかのオプションを選択した後に非表示にする必要があります。

残念ながら、以下は機能しません。

NO GOOD: self.navigationItem.rightBarButtonItem.hidden = YES;  // FOO CODE

方法はありますか?

38

参照をnilに設定してボタンを非表示にしますが、後で復元したい場合は、再割り当てできるようにそのコピーを保持する必要があります。

UIBarButtonItem *oldButton = self.navigationItem.rightBarButtonItem;
[oldButton retain];
self.navigationItem.rightBarButtonItem = nil;

//... later
self.navigationItem.rightBarButtonItem = oldButton;
[oldButton release];

個人的には、アプリでnavボタンを@propertiesにしているので、自由にゴミを捨てて再作成できます。

//mycontroller.h
UIBarButtonItem *rightNavButton;
@property (nonatomic, retain) UIBarButtonItem *rightNavButton;

//mycontroller.m
@synthesize rightNavButton;
- (UIBarButtonItem *)rightNavButton {
    if (!rightNavButton) {
        rightNavButton = [[UIBarButtonItem alloc] init];
        //configure the button here
    }
    return rightNavButton;
}

//later, in your code to show/hide the button:
self.navigationItem.rightBarButtonItem = self.rightNavButton;
73
Matt J

Swift 3

if let button = self.navigationItem.rightBarButtonItem {
                    button.isEnabled = false
                    button.tintColor = UIColor.clear
                }`
12
richc

参照をnilに設定します。

current_controller_in_navcontroller.navigationItem.rightBarButtonItem =  nil;

また、navController自体ではなく、navControllerによって現在表示されているコントローラーでこれを呼び出すようにしてください。

9
Stefan Ticu

表示:

[self.navigationItem.rightBarButtonItem.customView setAlpha:1.0];

隠す:

[self.navigationItem.rightBarButtonItem.customView setAlpha:0.0];

表示/非表示をアニメーション化することもできます

[UIView animateWithDuration:0.2 animations:^{
        [self.navigationItem.rightBarButtonItem.customView setAlpha:1.0];

    }];
8
HugoMasterPL

Storyboards&ARC用に更新されたMattのソリューションは次のとおりです。 IBOutletsはデフォルトで__weakであるため、リリースが早すぎないように強力に変更する必要があります。

@interface MAGTableViewController () <UITextFieldDelegate>

@property (strong, nonatomic) IBOutlet UIBarButtonItem *rightBarButton;

@end

@implementation MAGTableViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.navigationItem setRightBarButtonItem:nil];
}

- (IBAction)rightBarButtonItemTapped:(id)sender
{
    [self.view endEditing:YES];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self.navigationItem setRightBarButtonItem:self.rightBarButton];
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self.navigationItem setRightBarButtonItem:nil];
}

@end
5
mmackh

スイフト2.2

In Swift 2.2 self.navigationItemは機能しません。代わりにNavigationItemのアウトレットを作成し(「nav」の下に名前を付けました)使用します。

また、Xcode 7.3およびSwift 2.2を使用すると、次の提案は機能しませんでした

 nav.leftBarButtonItem?.customView?.hidden = true

そこで、上記の@Matt Jのアイデアを次のように使用しました(左側に2つのアイテムがあります)。

  1. ナビゲーションバーのアイテムとそれらを保存する変数のアウトレットを作成する

    @IBOutlet weak var settingItem: UIBarButtonItem!
    @IBOutlet weak var logoItem: UIBarButtonItem!
    
    var sav_settingItem: UIBarButtonItem = UIBarButtonItem()
    var sav_logoItem: UIBarButtonItem = UIBarButtonItem()
    
  2. ViewDidLoad()でアイテムを保存します

    sav_settingItem = nav.leftBarButtonItems![0]
    sav_logoItem = nav.leftBarButtonItems![1]
    
  3. 非表示にするには、それらをnilに設定します

    nav.leftBarButtonItem = nil
    nav.leftBarButtonItem = nil
    
  4. それらを表示するには

    if (nav.leftBarButtonItem == nil) {
        nav.leftBarButtonItem = sav_settingItem
        nav.leftBarButtonItems?.append(sav_logoItem)
        return
    }
    
4
Zvi

クレジットは、この質問からの回答であるこの回答に対して、学習者に移動する必要があります。

iOS-7ではオンデマンドで左ナビゲーションバーボタンを非表示および表示

これが答えであり、はるかに簡単です。

_//hide and reveal bar buttons
-(void) hideAndDisableLeftNavigationItem
{
    [self.navigationItem.leftBarButtonItem setTintColor:[UIColor clearColor]];
    [self.navigationItem.leftBarButtonItem setEnabled:NO];
}

-(void) showAndEnableLeftNavigationItem
{
    [self.navigationItem.leftBarButtonItem setTintColor:[UIColor blueColor]];
    [self.navigationItem.leftBarButtonItem setEnabled:YES];
}
_

次に、次のように_(IBAction)_内で必要なメソッドを参照します。

_[self hideAndDisableLeftNavigationItem];//[self showAndEnableLeftNavigationItem]; to show again
_

私は他のすべての方法を試しましたが、ボタンを@property (...) UIBarButtonItem....として参照することすら機能せず、これを見つけるまで何も機能しませんでした。

4
App Dev Guy

表示:

[self.navigationItem.rightBarButtonItem.customView setHidden:NO];

隠す:

[self.navigationItem.rightBarButtonItem.customView setHidden:YES];
3
Amr Angry

私の解決策:

self.navigationItem.rightBarButtonItem.customView.hidden=NO;
2
kozla13

Swift 2

トリック!

隠す:

if let btn = self.tabBarController!.navigationItem.rightBarButtonItem {
        btn.enabled = false
        btn.title = ""
}

表示:

if let btn = self.tabBarController!.navigationItem.rightBarButtonItem {
        btn.enabled = true
        btn.title = "ButtonName"
}
2
Vahid

Swift 4で、右または左のボタンを表示/非表示にするトリックがあります。

ステップ1: View ControllerでIBOutletボタンを作成します。

_@IBOutlet var navigationItemButton: UIBarButtonItem!
_

ステップ2:非表示ボタン機能の作成:

_func hideNavigationButton() {
    navigationItemButton.isEnabled = false
    navigationItemButton.tintColor = UIColor.clear
}
_

ステップ3:表示ボタン機能の作成:

_func showNavigationButton() {
    navigationItemButton.isEnabled = true
    navigationItemButton.tintColor = UIColor.white
}
_

手順4:必要な関数を呼び出し、hideNavigationButton()を使用して非表示にし、showNavigationButton()を使用してボタンを表示します。

よろしく!

右側にバーボタンアイテムが1つしかない場合は、これを使用できます。

self.navigationItem.rightBarButtonItem = nil;

右側に複数のバーボタンがある場合、たとえば、ナビゲーションアイテムの右側に2つのバーボタン項目(検索ボタンとフィルターボタン)があるとします。右のバーボタンのアイテムは

self.navigationItem.rightBarButtonItems = [searchItem、filterItem]

検索ボタンのみを非表示にする必要があります。次のように使用できます。

self.navigationItem.rightBarButtonItems = [filterItem]

これで、ナビゲーションアイテムから検索ボタンを完全に非表示にでき、フィルターアイテムが検索アイテムの代わりに表示されます

1
Hilaj

表示:

//set navigationItem tint color white
self.navigationItem.rightBarButtonItem.tintColor = [UIColor whiteColor];

隠す:

//set navigationItem tint clear white
self.navigationItem.rightBarButtonItem.tintColor = [UIColor clearColor];
0
jebin

For Swift 5 rightBarButtonItemを非表示にする場合

self.navigationItem.rightBarButtonItem?.customView?.isHidden = true
0
Hardik Thakkar

以下のコードを使用できます:

    self.navigationItem.rightBarButtonItem?.image = nil
    self.navigationItem.rightBarButtonItem?.isEnabled = false
0
Pankaj Jangid
  1. 特定のバーボタンを変数xxxButtonとして参照できると仮定します。

(アシスタントエディターを開き、Control + Drag xxxボタンをYourViewControllerクラスにアウトレット "xxxButton"としてドラッグしてください)。

または、_let xxxButton = navigationBar.buttons[1]_のようなものを使用できます

  1. xxxButton.customView = UIView()またはnavigationItem.rightBarButtonItems?.remove(at: (navigationItem.rightBarButtonItems?.index(of:xxxButton)!)!)を非表示

  2. _xxxButton.customView = nil_またはnavigationItem.rightBarButtonItems?.insert(newElement: xxxButton, at:SOME_INDEX)を表示

お役に立てば幸いです。

0
osexp2003

隠れる:

if let topItem = self.navigationController?.navigationBar.topItem {
    topItem.rightBarButtonItem = nil
}
0
Stalker

最初にタイトルを空に設定し、選択後に再度設定し直します。

0
Anil Kumar