右ボタンをUINavigationControllerに追加する方法は?


191

ナビゲーションコントローラーのトップバーに更新ボタンを追加しようとしていますが、うまくいきません。

これがヘッダーです:

@interface PropertyViewController : UINavigationController {

}

これが私がそれを追加しようとしている方法です:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain
                                          target:self action:@selector(refreshPropertyList:)];      
        self.navigationItem.rightBarButtonItem = anotherButton;
    }
    return self;
}

回答:


362

viewDidLoadで実行してみてください。一般に、とにかくその時点までできる限り延期する必要があります。UIViewControllerが初期化されるときは、表示されるまでにまだかなり時間がかかる場合があり、早期に作業を行ってメモリを占有する意味がありません。

- (void)viewDidLoad {
  [super viewDidLoad];

  UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain target:self action:@selector(refreshPropertyList:)];          
  self.navigationItem.rightBarButtonItem = anotherButton;
  // exclude the following in ARC projects...
  [anotherButton release];
}

現在動作していない理由については、コードを確認しないと100%確実とは言えませんが、initとビューの読み込みの間に多くのことが発生し、navigationItemがリセットされる原因となっている可能性がありますの間に。


45
UINavigationControllerサブクラスの外でこれを実行している場合は、次のように参照します。someNavController.topLevelController.navigationItem.rightBarButtonItem = anotherButton
ransomweaver

2
私は提案されたソリューションを実装していて、@ selectorメソッド名がコロン(:)で終わる必要があることに気づくまで、アプリがクラッシュし続けました。
ステルス

10
でも内部UINavigationContollerのviewDidLoadメソッドの、私は次のようにそれを呼び出す必要があったself.topViewController.navigationItem.leftBarButtonItem = nextButton;
ジョセフ・

ありがとう!@ジョセフ、あなたの説明は私を救った。(y):)
Prasanna 2018年

38

PropertyViewController作成したこのクラスにプッシュされるView ControllerのnavigationItemにボタンを追加してみてください。

あれは:

MainViewController *vc = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeInfoLight];
[infoButton addTarget:self action:@selector(showInfo) forControlEvents:UIControlEventTouchUpInside];
vc.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:infoButton] autorelease];

PropertyViewController *navController = [[PropertyViewController alloc] initWithRootViewController:vc];

これで、プログラムで作成されたこのinfoButtonがナビゲーションバーに表示されます。ナビゲーションコントローラは、表示UIViewControllerしようとしているものからその表示情報(タイトル、ボタンなど)を取得するという考えです。実際にボタンなどを直接追加することはありませんUINavigationController


2
UINavigationControllerでrightBarButtonItemを直接設定しても機能しません(上記のLouis Gerbargの提案による)。代わりに、Ademが提案するように、手元のUIViewControllerにアイテムを直接設定することで機能します!
leviathan

4
「プッシュされるビューコントローラのnavigationItemにボタンを追加してみてください」の +1 !
Kjuly 2013年

25

インターフェイスビルダーでナビゲーションバーボタンを追加する方法を探している人(私のような)がここに来るようです。以下の答えはそれを行う方法を示しています。

ストーリーボードにナビゲーションコントローラーを追加する

View Controllerを選択し、XcodeメニューでEditor> Embed In> Navigation Controllerを選択します

ここに画像の説明を入力してください

または、UINavigationBarオブジェクトライブラリからを追加することもできます。

バーボタンアイテムを追加する

UIBarButtonItemオブジェクトライブラリから上部のナビゲーションバーにをドラッグします。

ここに画像の説明を入力してください

次のようになります。

ここに画像の説明を入力してください

属性を設定する

「アイテム」をダブルクリックしてテキストを「更新」のようなものに変更できますが、実際に使用できる更新のアイコンがあります。ただのためのインスペクタ属性を選択UIBarButtonItemし、ためにシステムアイテムが選択更新を

ここに画像の説明を入力してください

これにより、デフォルトの更新アイコンが表示されます。

ここに画像の説明を入力してください

IBアクションを追加する

コントロールをからUIBarButtonItemビューコントローラにドラッグして、を追加し@IBActionます。

class ViewController: UIViewController {

    @IBAction func refreshBarButtonItemTap(sender: UIBarButtonItem) {
        
        print("How refreshing!")
    }
    
}

それでおしまい。


申し訳ありませんが、あなたが話していることを完全に理解することはできません。あなたが話していることを示す画像で新しい質問をしてみてください。次に、リンクをここに追加します。
Suragch 2016年

@Suragch、ストーリーボードの代わりにxibファイルで同じことをするにはどうすればよいですか?、ありがとう
Cristian Chaparro A.

@CristianChaparroA。通常、xibファイルは単一のビュー用であり、(バーボタン項目をホストする)ナビゲーションバーは複数のビュー用です。私は、バーボタンアイテムでxibを使用したことがありません。新しい質問をしてから、ここにリンクしてみてください。
Suragch 2016年

14

「更新」にはデフォルトのシステムボタンがあります。

- (void)viewDidLoad {
    [super viewDidLoad];

    UIBarButtonItem *refreshButton = [[[UIBarButtonItem alloc] 
                            initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh
                            target:self action:@selector(refreshClicked:)] autorelease];
    self.navigationItem.rightBarButtonItem = refreshButton;

}

- (IBAction)refreshClicked:(id)sender {

}

11

あなたはこれを使うことができます:

Objective-C

UIBarButtonItem *rightSideOptionButton = [[UIBarButtonItem alloc] initWithTitle:@"Right" style:UIBarButtonItemStylePlain target:self action:@selector(rightSideOptionButtonClicked:)];          
self.navigationItem.rightBarButtonItem = rightSideOptionButton;

迅速

let rightSideOptionButton = UIBarButtonItem()
rightSideOptionButton.title = "Right"
self.navigationItem.rightBarButtonItem = rightSideOptionButton

6
-(void) viewWillAppear:(BOOL)animated
{

    UIButton *btnRight = [UIButton buttonWithType:UIButtonTypeCustom];
    [btnRight setFrame:CGRectMake(0, 0, 30, 44)];
    [btnRight setImage:[UIImage imageNamed:@"image.png"] forState:UIControlStateNormal];
    [btnRight addTarget:self action:@selector(saveData) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *barBtnRight = [[UIBarButtonItem alloc] initWithCustomView:btnRight];
    [barBtnRight setTintColor:[UIColor whiteColor]];
    [[[self tabBarController] navigationItem] setRightBarButtonItem:barBtnRight];

}

ViewDidLoadの代わりにViewWillAppearでそれを行うことに害があることを誰かが教えてもらえますか
Niranjan Molkeri

6

Swift 2の場合:

self.title = "Your Title"

var homeButton : UIBarButtonItem = UIBarButtonItem(title: "LeftButtonTitle", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("yourMethod"))

var logButton : UIBarButtonItem = UIBarButtonItem(title: "RigthButtonTitle", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("yourMethod"))

self.navigationItem.leftBarButtonItem = homeButton
self.navigationItem.rightBarButtonItem = logButton

新しいswift2セレクターを使用することをお勧めします。#selector(classname.functionname)
空のない

5

これがSwiftのソリューションです(必要に応じてオプションを設定してください):

var optionButton = UIBarButtonItem()
optionButton.title = "Settings"
//optionButton.action = something (put your action here)
self.navigationItem.rightBarButtonItem = optionButton

4

なぜあなたはサブクラスなのUINavigationControllerですか?ボタンを追加するだけの場合は、サブクラス化する必要はありません。

UINavigationController最上部にaの階層を設定し、次にルートビューコントローラーのviewDidLoad:メソッドで:ボタンを設定し、呼び出しによってナビゲーション項目にアタッチします

[[self navigationItem] setRightBarButtonItem:myBarButtonItem];

1
それは良い質問です。私がやろうとしていることは、実際には非常に一般的なデザインパターンです。これは、各タブにナビゲーションコントローラーを備えた基本的なタブコントローラーです。より良い方法がある場合は、提案をお待ちしています。たぶん私もその質問をする必要があります。
Artilheiro 2009


3

Swift 4:

override func viewDidLoad() {
    super.viewDidLoad()

    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "tap me", style: .plain, target: self, action: #selector(onButtonTap))
}

@objc func onButtonTap() {
    print("you tapped me !?")
}

右側のボタンが必要な場合は、navigationItem.rightBarButtonItemを使用するだけ
Ghanshyam Bagul

2
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 110, 50)];
view.backgroundColor = [UIColor clearColor];

UIButton *settingsButton =  [UIButton buttonWithType:UIButtonTypeCustom];
[settingsButton setImage:[UIImage imageNamed:@"settings_icon_png.png"] forState:UIControlStateNormal];
[settingsButton addTarget:self action:@selector(logOutClicked) forControlEvents:UIControlEventTouchUpInside];
[settingsButton setFrame:CGRectMake(40,5,32,32)];
[view addSubview:settingsButton];

UIButton *filterButton =  [UIButton buttonWithType:UIButtonTypeCustom];
[filterButton setImage:[UIImage imageNamed:@"filter.png"] forState:UIControlStateNormal];
[filterButton addTarget:self action:@selector(openActionSheet) forControlEvents:UIControlEventTouchUpInside];
[filterButton setFrame:CGRectMake(80,5,32,32)];
[view addSubview:filterButton];



self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:view];

2

これを試してみてください。

ナビゲーションバーと右ボタンに背景画像を追加しました。

 UIBarButtonItem *Savebtn=[[UIBarButtonItem alloc]initWithImage:[[UIImage    
 imageNamed:@"bt_save.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] 
 style:UIBarButtonItemStylePlain target:self action:@selector(SaveButtonClicked)];
 self.navigationItem.rightBarButtonItem=Savebtn;

0
    UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(add:)];
self.navigationItem.rightBarButtonItem = rightBarButtonItem;

0
- (void)viewWillAppear:(BOOL)animated
{    
    [self setDetailViewNavigationBar];    
}
-(void)setDetailViewNavigationBar
{
    self.navigationController.navigationBar.tintColor = [UIColor purpleColor];
    [self setNavigationBarRightButton];
    [self setNavigationBarBackButton];    
}
-(void)setNavigationBarBackButton// using custom button 
{
   UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithTitle:@"  Back " style:UIBarButtonItemStylePlain target:self action:@selector(onClickLeftButton:)];          
   self.navigationItem.leftBarButtonItem = leftButton;    
}
- (void)onClickLeftButton:(id)sender 
{
   NSLog(@"onClickLeftButton");        
}
-(void)setNavigationBarRightButton
{

  UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain target:self action:@selector(onClickrighttButton:)];          
self.navigationItem.rightBarButtonItem = anotherButton;   

}
- (void)onClickrighttButton:(id)sender 
{
   NSLog(@"onClickrighttButton");  
}

0
    self.navigationItem.rightBarButtonItem =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshData)];



}

-(void)refreshData{
    progressHud= [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
    [progressHud setLabelText:@"拼命加载中..."];
    [self loadNetwork];
}

0

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animatedメソッドにbarButtonItemを追加する必要があります。


0

このObjective-Cコードをコピーして貼り付けるだけです。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self addRightBarButtonItem];
}
- (void) addRightBarButtonItem {
    UIButton *btnAddContact = [UIButton buttonWithType:UIButtonTypeContactAdd];
    [btnAddContact addTarget:self action:@selector(addCustomerPressed:) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:btnAddContact];
    self.navigationItem.rightBarButtonItem = barButton;
}

#pragma mark - UIButton
- (IBAction)addCustomerPressed:(id)sender {
// Your right button pressed event
}

私は助けようとしています
Vivek

0

この問題は、ビューコントローラーを削除するか、インターフェイスビルダー(main.storyboard)内に新しいビューコントローラーを追加しようとした場合に発生する可能性があります。この問題を修正するには、新しいビューコントローラー内に「ナビゲーションアイテム」を追加する必要があります。新しいView Controller画面を作成して「ナビゲーションアイテム」に自動接続しない場合があります。

  1. main.storyboardに移動します。
  2. その新しいビューControllerを選択します。
  3. ドキュメントの概要に移動します。
  4. ビューコントローラの内容を確認してください。
  5. 新しいビューコントローラーにナビゲーションアイテムがない場合は、前のビューコントローラーからナビゲーションアイテムをコピーして、新しいビューコントローラーに貼り付けます。
  6. プロジェクトを保存して消去します。

0

また、あなたはを使用して複数のボタンを追加することができます rightBarButtonItems

-(void)viewDidLoad{

    UIBarButtonItem *button1 = [[UIBarButtonItem alloc] initWithTitle:@"button 1" style:UIBarButtonItemStylePlain target:self action:@selector(YOUR_METHOD1:)];
    UIBarButtonItem *button2 = [[UIBarButtonItem alloc] initWithTitle:@"button 2" style:UIBarButtonItemStylePlain target:self action:@selector(YOUR_METHOD2:)];

    self.navigationItem.rightBarButtonItems = @[button1, button2];
}

-1

@Artilheiro:ナビゲーションベースのプロジェクトの場合、BaseViewControllerを作成できます。他のすべてのビューはこのBaseViewを継承します。BaseViewでは、右ボタンを追加したり、左ボタンのテキストを変更したりするためのジェネリックメソッドを定義できます。

例:

@interface BaseController:UIViewController {

}-(void)setBackButtonCaption:(NSString *)caption;

(void)setRightButtonCaption:(NSString *)caption selectot:(SEL)selector;

@end // BaseView.M

(void)setBackButtonCaption:(NSString *)caption {

UIBarButtonItem *backButton =[[UIBarButtonItem alloc] init];

backButton.title= caption;
self.navigationItem.backBarButtonItem = backButton;
[backButton release];

}-(void)setRightButtonCaption:(NSString *)caption selectot:(SEL)selector {

  UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] init];
rightButton.title = caption;

rightButton.target= self;

[rightButton setAction:selector];

self.navigationItem.rightBarButtonItem= rightButton;

[rightButton release];

}

そして、任意のカスタムビューで、このベースビューを実装してメソッドを呼び出します。

@interface LoginView:BaseController {

一部のメソッドでは、基本メソッドを次のように呼び出します。

SEL sel = @selector(switchToForgotPIN);

[super setRightButtonCaption:@ "PINを忘れた" selectot:sel];

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.