ボタンをUINavigationBarに追加する方法


回答:


294

設定するには、サンプルコードrightbuttonNavigationBar

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" 
    style:UIBarButtonItemStyleDone target:nil action:nil];
UINavigationItem *item = [[UINavigationItem alloc] initWithTitle:@"Title"];
item.rightBarButtonItem = rightButton;
item.hidesBackButton = YES;
[bar pushNavigationItem:item animated:NO];

ただし、通常はを使用して、NavigationController次のように記述できます。

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
    style:UIBarButtonItemStyleDone target:nil action:nil];
self.navigationItem.rightBarButtonItem = rightButton;

1
異なる列挙型「UIBarButtonItemStyle」に列挙型「UIBarButtonSystemItem」から暗黙的な変換:セマンティック問題: - >警告パラメータ:私は、スタイル上の警告を取得
POJO

3
警告を回避するには、これをinitWithBarButtonSystemItem:UIBarButtonSystemItemDoneにする必要があります。
JordanC 2011

2
この例では、「バー」の出所がわかりません。UINavigationItemのデフォルトのトップバープロパティは何ですか?
動脈瘤2012年

回答のbar変数は、ナビゲーションコントローラーによって管理されていないナビゲーションバーです。ナビゲーションコントローラーがある場合は、それが管理する独自のナビゲーションバーがあります。この場合、ナビゲーションコントローラーにプッシュする各ビューコントローラーは、独自のナビゲーションアイテムを構成する必要があります(これには、独自のnavigationItemでのrightBarButtonItemの設定が含まれます)プロパティ)。
Vasiliy Kulakov 2014年

現在の読者にとって、[rightbutton release]ARCの下で呼び出す理由はないと思います(これは、このコメントが最初に書かれた時点ではありませんでした)。
カルボカチオン

20

上記の答えは良いですが、いくつかのヒントを追加して具体化したいと思います。

戻るボタンのタイトル(ナビゲーションバーの左側にある矢印yの方向)を変更する場合は、表示するビューコントローラーではなく、PREVIOUSビューコントローラーで行う必要があります。これは、「ねえ、この上に別のビューコントローラをプッシュする場合は、デフォルトの代わりに、戻るボタンを「戻る」(または何でも)と呼んでください。

UIPickerViewが表示されているときなど、特別な状態のときに[戻る]ボタンを非表示にするself.navigationItem.hidesBackButton = YES;場合は、特別な状態を終了するときに必ずを使用して設定し直してください。

特別なシンボリックボタンの1つを表示initWithBarButtonSystemItem:target:actionする場合は、次のような値を持つフォームを使用します。UIBarButtonSystemItemAdd

そのシンボルの意味はあなた次第ですが、ヒューマンインターフェイスガイドラインに注意してください。UIBarButtonSystemItemAddを使用してアイテムを削除すると、おそらくアプリケーションが拒否されます。


11

カスタムボタンをナビゲーションバーに追加します(buttonItemの画像とアクションメソッドの指定(void)openView {}および)。

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, 32, 32);
[button setImage:[UIImage imageNamed:@"settings_b.png"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(openView) forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem *barButton=[[UIBarButtonItem alloc] init];
[barButton setCustomView:button];
self.navigationItem.rightBarButtonItem=barButton;

[button release];
[barButton release];

7

以下の例では、右側のナビゲーションバーに「連絡先」というタイトルのボタンが表示されます。そのアクションは、viewcontrollerから「contact」という名前のメソッドを呼び出します。この線がないと、右ボタンは表示されません。

    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Contact"
                                                                          style:UIBarButtonItemStylePlain target:self action:@selector(contact:)];;

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


3

Swift 2では、次のようにします。

let rightButton: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: nil, action: nil)
self.navigationItem.rightBarButtonItem = rightButton

(大きな変更ではありません)Swift 4/5では、次のようになります。

let rightButton: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.done, target: nil, action: nil)
self.navigationItem.rightBarButtonItem = rightButton

2

以下を使用しないのはなぜですか(iPhoneナビゲーションバーの[カスタムの戻るボタンを描画する]から)

// Add left
UINavigationItem *previousItem = [[UINavigationItem alloc] initWithTitle:@"Back title"];
UINavigationItem *currentItem = [[UINavigationItem alloc] initWithTitle:@"Main Title"];
[self.navigationController.navigationBar setItems:[NSArray arrayWithObjects:previousItem, currentItem, nil] animated:YES];

// set the delegate to self
[self.navigationController.navigationBar setDelegate:self];

0

迅速3

    let cancelBarButton = UIBarButtonItem(title: "Cancel", style: .done, target: self, action: #selector(cancelPressed(_:)))
    cancelBarButton.setTitleTextAttributes( [NSFontAttributeName : UIFont.cancelBarButtonFont(),
                                                          NSForegroundColorAttributeName : UIColor.white], for: .normal)
    self.navigationItem.leftBarButtonItem = cancelBarButton


    func cancelPressed(_ sender: UIBarButtonItem ) {
        self.dismiss(animated: true, completion: nil)
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.