Bagaimana cara menambahkan tombol ke UINavigationBar?

Jawaban:

294

Contoh kode untuk mengatur rightbuttonpada a NavigationBar.

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];

Tetapi biasanya Anda akan memiliki NavigationController, memungkinkan Anda untuk menulis:

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
    style:UIBarButtonItemStyleDone target:nil action:nil];
self.navigationItem.rightBarButtonItem = rightButton;
Mads Mobæk
sumber
1
Saya mendapat peringatan pada style: parameter -> peringatan: Semantic Issue: Konversi implisit dari jenis enumerasi 'UIBarButtonSystemItem' ke jenis enumerasi yang berbeda 'UIBarButtonItemStyle'
pojo
3
Ini harus initWithBarButtonSystemItem: UIBarButtonSystemItemDone untuk menghindari peringatan.
JordanC
2
Dalam contoh, saya tidak mengerti dari mana asal "bar". Apa properti bilah atas default untuk UINavigationItem?
aneuryzm
Variabel bilah dalam jawabannya adalah bilah navigasi apa pun yang tidak dikelola oleh pengontrol navigasi. Jika Anda memiliki pengontrol navigasi, ia memiliki bilah navigasi sendiri yang dikelolanya - dalam hal ini, setiap pengontrol tampilan yang Anda dorong ke pengontrol navigasi harus mengonfigurasi item navigasinya sendiri (yang mencakup pengaturan rightBarButtonItem di navigationItemnya sendiri Properti).
Vasiliy Kulakov
Untuk pembaca saat ini, saya tidak percaya ada alasan untuk menelepon di [rightbutton release]bawah ARC (yang tidak ada pada saat komentar ini pertama kali ditulis).
karbokation
20

Jawaban di atas bagus, tetapi saya ingin menyempurnakannya dengan beberapa tip lagi:

Jika Anda ingin mengubah judul tombol kembali (panah-y tampak di kiri bilah navigasi) Anda HARUS melakukannya di pengontrol tampilan SEBELUMNYA, bukan yang akan ditampilkan. Ini seperti mengatakan "hei, jika Anda pernah menekan pengontrol tampilan lain di atas yang satu ini, panggil tombol kembali" Kembali "(atau apa pun) alih-alih default."

Jika Anda ingin menyembunyikan tombol kembali selama status khusus, seperti saat UIPickerView ditampilkan, gunakan self.navigationItem.hidesBackButton = YES;dan ingat untuk menyetelnya kembali saat Anda meninggalkan status khusus.

Jika Anda ingin menampilkan salah satu tombol simbolik khusus, gunakan formulir initWithBarButtonSystemItem:target:actiondengan nilai sepertiUIBarButtonSystemItemAdd

Ingat, arti simbol itu terserah Anda, tapi hati-hatilah dengan Panduan Antarmuka Manusia. Menggunakan UIBarButtonSystemItemAdd berarti menghapus item mungkin akan membuat aplikasi Anda ditolak.

Amagrammer
sumber
11

Menambahkan tombol kustom ke bilah navigasi (dengan gambar untuk buttonItem dan menentukan metode aksi (void) openView {} dan).

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];
Oleh Kudinov
sumber
7

Contoh di bawah ini akan menampilkan tombol dengan judul "Kontak" pada bilah navigasi di sebelah kanan. Tindakannya memanggil metode bernama "kontak" dari viewcontroller. Tanpa garis ini tombol kanan tidak terlihat.

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

masukkan deskripsi gambar di sini

Tibidabo
sumber
3

Di Swift 2, Anda akan melakukan:

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

(Bukan perubahan besar) Di Swift 4/5, itu akan menjadi:

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

Mengapa tidak menggunakan yang berikut ini: (dari Draw custom Back button di iPhone Navigation Bar )

// 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];
Joe
sumber
0

cepat 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)
    }
venky
sumber