Bagaimana cara menambahkan 2 tombol ke UINavigationbar di sisi kanan tanpa IB?

86

Bagaimana cara menambahkan 2 tombol ke UINavigationBartanpa XIB?
2 tombol harus sejajar di sisi kanan UINavigationBar.

Saya tahu bagaimana saya bisa menambahkan satu tombol, tapi bagaimana kalau dua?

Alexander
sumber

Jawaban:

142

Dengan iOS 5+, semuanya semudah:

UIBarButtonItem *btnShare = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(share)];
UIBarButtonItem *btnRefresh = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh)];
[self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:btnShare, btnRefresh, nil]];
domsom
sumber
Saya pikir ini tersedia di iOS 5 juga.
iAmd
1
Bagus dan sederhana! Saya juga menyertakan tombol kanan yang ada (diatur dalam IB) UIBarButtonItem * btnCurrent = self.navigationItem.rightBarButtonItem;
Duncan
43

Saya memposting kode (lihat di bawah) untuk menambahkan dua tombol di sebelah kanan navigationBar. Anda dapat menyetel barStyle = -1alih-alih membuat subclass UIToolbar.

UIToolbar *tools = [[UIToolbar alloc]
                    initWithFrame:CGRectMake(0.0f, 0.0f, 103.0f, 44.01f)]; // 44.01 shifts it up 1px for some reason
tools.clearsContextBeforeDrawing = NO;
tools.clipsToBounds = NO;
tools.tintColor = [UIColor colorWithWhite:0.305f alpha:0.0f]; // closest I could get by eye to black, translucent style.
                                                              // anyone know how to get it perfect?
tools.barStyle = -1; // clear background
NSMutableArray *buttons = [[NSMutableArray alloc] initWithCapacity:3];

// Create a standard refresh button.
UIBarButtonItem *bi = [[UIBarButtonItem alloc]
    initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh:)];
[buttons addObject:bi];
[bi release];

// Create a spacer.
bi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
bi.width = 12.0f;
[buttons addObject:bi];
[bi release];

// Add profile button.
bi = [[UIBarButtonItem alloc] initWithTitle:@"Profile" style:UIBarButtonItemStylePlain target:self action:@selector(goToProfile)];
bi.style = UIBarButtonItemStyleBordered;
[buttons addObject:bi];
[bi release];

// Add buttons to toolbar and toolbar to nav bar.
[tools setItems:buttons animated:NO];
[buttons release];
UIBarButtonItem *twoButtons = [[UIBarButtonItem alloc] initWithCustomView:tools];
[tools release];
self.navigationItem.rightBarButtonItem = twoButtons;
[twoButtons release];
ma11hew28
sumber
ini adalah posting pertama yang saya temukan yang menyertakan pengaturan toolbar tambahan yang membuatnya bekerja dengan warna latar belakang yang berbeda, terima kasih
Chris
Ini adalah jawaban yang benar untuk pertanyaan ini .... Kode di tautan ini berfungsi dengan sempurna ... Anda pria yang luar biasa ... tepuk tangan ... :) Semua jawaban di atas salah dan tidak berfungsi
Sameera Chathuranga
Solusinya tidak bekerja dengan sempurna, saat Anda menampilkan navigationController sebagai contentViewController dari UIPopoverController. Saat Anda menyetel UIToolbar sebagai tampilan kustom leftBarButtonItem, area sentuh tombol kedua salah (bergeser ke kiri, yang berarti sisi kanan tombol kedua tidak dapat diklik). Ketika sampai pada rightBarButtonItem, tombol kedua salah ditarik (hanya sisi kiri saja yang ditarik) ... Dalam hal ini saya harus tetap menggunakan custom UIToolbar sebagai header daripada UINavigationBar Saya rasa ...
manicaesar
1
Salah satu trik di sini adalah tools.barStyle = -1garis: tanpa itu ada beberapa artefak visual jika Anda menggunakan UIBarStyleBlack dengan translucent = YES. (Yaitu warna latar belakang tidak cocok dengan bilah navigasi.) Apakah itu fitur yang tidak terdokumentasi? Jika demikian, kode ini agak rapuh. Saya belum pernah melihatnya di mana pun di dokumen.
ettore
28

Anda dapat menggunakan tombol bar yang diinisialisasi dengan toolbar sebagai tampilan kustom.

UIToolbar* toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 103.0f, 44.01f)];
NSArray* buttons = [NSArray arrayWithObjects:self.editButtonItem, someOtherButton, nil];
[toolbar setItems:buttons animated:NO];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:toolbar];

Akan memberikan sesuatu seperti ini:

teks alt

Catatan: Jawaban ini sudah usang untuk iOS 6 atau lebih baru

Nathan
sumber
3
@SameeraChathuranga Anda tidak bisa begitu saja menyalin dan menempelkan kode ini tanpa melakukan apa pun. Anda harus memastikan bahwa 'self.editButtonItem' & 'someOtherButton' didefinisikan di suatu tempat terlebih dahulu ...
Nathan
Hai! Terima kasih atas cuplikannya. Menggunakan itu saya berhasil menambahkan dua tombol tetapi ada masalah kecil. Begini tampilannya. Seperti yang Anda lihat, batas sedikit persegi terlihat di sekitar toolbar. Bagaimana saya bisa menghapus ini dan membuatnya mulus seperti yang Anda miliki di tangkapan layar di atas? Terima kasih. :)
Isuru
Aneh, saya tidak mendapatkan batas pada tombol "tambah". Saya hanya mendapatkan perbatasan jika saya menggunakan UIBarButtonStyles yang tidak memiliki ikon.
pojo
23

Berikut adalah contoh kerja dari proyek saya saat ini:

dua tombol ke rightBarButtonItem UINavigationbar

UIButton *homeBtn =  [UIButton buttonWithType:UIButtonTypeCustom];
[homeBtn setImage:[UIImage imageNamed:@"home-icon"] forState:UIControlStateNormal];
//[homeBtn addTarget:self action:@selector(home) forControlEvents:UIControlEventTouchUpInside];
[homeBtn setFrame:CGRectMake(0, 0, 32, 32)];

UIButton *settingsBtn =  [UIButton buttonWithType:UIButtonTypeCustom];
[settingsBtn setImage:[UIImage imageNamed:@"settings-icon"] forState:UIControlStateNormal];
//[settingsBtn addTarget:self action:@selector(settings) forControlEvents:UIControlEventTouchUpInside];
[settingsBtn setFrame:CGRectMake(44, 0, 32, 32)];

UIView *rightBarButtonItems = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 76, 32)];
[rightBarButtonItems addSubview:homeBtn];
[rightBarButtonItems addSubview:settingsBtn];

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:rightBarButtonItems];
Adnan
sumber
18
UINavigationBar *navBarView = [[UINavigationBar alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 320.0f, 42.0f)];
    navBarView.tintColor= [UIColor colorWithRed:90.0/255.0f green:53.0/255.0f blue:45.0/255.0f alpha:1.0];

    UIBarButtonItem *left=[[UIBarButtonItem alloc]initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backView)];
    UIBarButtonItem *right=[[UIBarButtonItem alloc]initWithTitle:@"Save" style:UIBarButtonItemStylePlain target:self action:@selector(SaveImage)];
    UIBarButtonItem *Add=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(AddComment:)];

    UINavigationItem *navigationItem = [[UINavigationItem alloc] init];
    navigationItem.leftBarButtonItem = left;
    NSMutableArray *buttonArray=[[NSMutableArray alloc]initWithCapacity:2];
    [buttonArray addObject:right];
    [buttonArray addObject:Add];
    navigationItem.rightBarButtonItems = buttonArray;
    [navBarView pushNavigationItem:navigationItem animated:NO];
[self.view addSubView:navBarView];
Gurpreet Singh
sumber
14

Cepat:

override func viewDidLoad() {
    super.viewDidLoad()

    // Additional bar button items
    let button1 = UIBarButtonItem(image: UIImage(named: "image1.png"), style: .Plain, target: self, action: "methodA")
    let button2 = UIBarButtonItem(image: UIImage(named: "image2.png"), style: .Plain, target: self, action: "methodB")
    let button3 = UIBarButtonItem(image: UIImage(named: "image3.png"), style: .Plain, target: self, action: "methodC")

    navigationItem.leftItemsSupplementBackButton = true
    navigationItem.setLeftBarButtonItem(button1, animated: true)
    navigationItem.setRightBarButtonItems([button2, button3], animated: true)

Metode untuk tombol:

func methodA() {
    performSegueWithIdentifier("segA", sender: nil)
}

func methodB() {
    performSegueWithIdentifier("segB", sender: nil)
}

func methodC() {
    performSegueWithIdentifier("segC", sender: nil)
}
LondonGuy
sumber
9

CEPAT

Anda bisa melakukannya dengan cepat seperti ini

        var editImg   : UIImage = UIImage(named: "plus")!
        var searchImg : UIImage = UIImage(named: "search")!
        
        var editBtn : UIBarButtonItem = UIBarButtonItem(image: editImg,  style: UIBarButtonItemStyle.Plain, target: self, action: Selector("editBtnPressed:"))
        
        var searchBtn : UIBarButtonItem = UIBarButtonItem(image: searchImg,  style: UIBarButtonItemStyle.Plain, target: self, action: Selector ("searchBtnPressed:"))
        
        var buttons : NSArray = [editBtn, searchBtn]
        
        self.navigationItem.rightBarButtonItems = buttons

        func editBtnPressed(sender: AnyObject){
        
        }
    
        func searchBtnPressed(sender: AnyObject){
        
        }
Dharmbir Singh
sumber
7

Anda dapat membuat UIView dan menambahkan dua tombol di tampilan itu. Dan tambahkan UIView itu sebagai tombol kanan :)

UIView* rightItem = [UIView alloc] initWithFrame:frame];
//Create UIButton1 b1
//Create UIButton2 b2
[rightItem addSubview:b1];
[rightItem addSubview:b2];

self.navigationItem.rightBarButtonItem = rightItem;
prakash
sumber
@NathanReed, Seharusnya self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView: rightItem];(contoh kode kerja lengkap di bawah [oleh saya])
Adnan
7

Respons Prakash juga berfungsi di pembuat antarmuka.

Seret a UIViewdi UINavigationItem, lalu Anda dapat meletakkan beberapa UIButtonsebagai anak dari ini UIViewdan membuat hierarki seperti ini:

Bilah navigasi dengan hierarki 3 tombol

Atur warna latar belakang UIViewmenjadi jelas dan tambahkan beberapa batasan ke tengah vertikal tombol dan perbaiki posisi horizontal. Ini adalah hasil yang saya dapatkan dengan baris kode nol:

Menghasilkan simulator

Axel Guilmin
sumber
1
Ini bekerja! Bagi mereka yang sama bingungnya dengan saya, yang saya lakukan adalah mengganti Item Tombol Bar dengan UIView sebagai gantinya dengan menyeretnya ke UINavigationItem seperti yang dijelaskan. Setelah itu akan persis sama seperti menyeret tombol ke layar Anda dan menambahkan batasan. Kudos untuk solusi ini karena tanpa kode apa pun sekarang saya dapat melakukan ini ditambah membuat segue ke adegan berbeda hanya dengan menyeret tombol di storyboard :) Terima kasih!
Bruce
2
Ini tidak diperlukan sama sekali. Anda cukup menyeret item tombol bar ke tombol bar kanan. Xcode 7.3.1
João Nunes
4

Di SWIFT, Anda dapat menambahkan kode ini untuk mengatur dua tombol di sisi kanan (atau kiri):

self.navigationItem.rightBarButtonItems = [UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Action, target: self, action: "barButtonItemClicked"), UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Search, target: self, action: "barButtonItemClicked")]
Alberto Bailac Moreno
sumber
3

Inilah kode Swift 4:

    let editImage   = UIImage(named: "plus")!
    let searchImage = UIImage(named: "search")!
    let editButton   = UIBarButtonItem(image: editImage,  style: .plain, target: self, action:#selector(didTapEditButton))
    let searchButton = UIBarButtonItem(image: searchImage,  style: .plain, target: self, action:#selector(didTapSearchButton))
    navigationItem.rightBarButtonItems = [editButton, searchButton]


 @objc func didTapEditButton(sender: AnyObject){

  }

 @objc func didTapSearchButton(sender: AnyObject){

  }
Mannam Brahmam
sumber
2

Anda tidak perlu menambahkan dua tombol. Anda hanya perlu menambahkan

UIBarButtonSystemItemFlexibleSpace 

tidak

UIBarButtonSystemItemFixedSpace

dan sebuah tombol, sehingga posisinya berada di sisi kanan.

Seperti ini:

UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];
toolbar.barStyle = UIBarStyleBlackTranslucent;

UIBarButtonItem *spaceButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

UIBarButtonItem *infoButtonItem1 = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(empresaTextFieldDone)];    

toolbar.items = [NSArray arrayWithObjects: spaceButton, infoButtonItem1, nil];   
bruno
sumber
2
UIView* buttonsView= [[UIView alloc] initWithFrame:CGRectMake(10, 6, 84, 32)];
buttonsView.backgroundColor=[UIColor clearColor];

btn_back = [UIButton buttonWithType:UIButtonTypeCustom];
[btn_back addTarget:self action:@selector(backButtonClick) 
forControlEvents:UIControlEventTouchUpInside];
btn_back.frame = CGRectMake(0, 0, 32, 32);
btn_back.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"close.png"]];

btn_help = [UIButton buttonWithType:UIButtonTypeCustom];
[btn_help addTarget:self action:@selector(helpButtonClick) 
 forControlEvents:UIControlEventTouchUpInside];
btn_help.frame = CGRectMake(42, 0, 32, 32);
btn_help.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"info.png"]];

[buttonsView addSubview:btn_back];
[buttonsView addSubview:btn_help];

segmentItem = [[UIBarButtonItem alloc] initWithCustomView:buttonsView];
self.navigationItem.rightBarButtonItem = segmentItem;
SURESH SANKE
sumber
1

Jika seseorang datang ke sini, seperti saya, mencari jawaban MonoTouch, tidak terlihat lagi selain NavigationItem.RightBarButtonItemsarray.

Dan Abramov
sumber
1

di SWIFT:

(misalkan Anda memiliki nav. controller) di Root Controller gunakan kode ini:

kiri: ..

    let leftBtn =  UIBarButtonItem(title: "Do It", style: UIBarButtonItemStyle.Plain,
        target: self, action: "doIt:")
    leftBtn.tag=100
    self.navigationItem.leftBarButtonItem = leftBtn

Baik:

    let rightView = UIView(frame:  CGRectMake(0, 0, 100, 30))
    rightView.backgroundColor = UIColor.redColor()

    let btn1 = UIButton(frame: CGRectMake(0,0,60, 20))
    btn1.setTitle("R1", forState: UIControlState.Normal)
    btn1.tag=101
    btn1.addTarget(self, action: "doIt:", forControlEvents: UIControlEvents.TouchUpInside)
    rightView.addSubview(btn1)

    let btn2 = UIButton(frame: CGRectMake(30,0,60, 20))
    btn2.setTitle("R2", forState: UIControlState.Normal)
    btn2.tag=102
    btn2.addTarget(self, action: "doIt:", forControlEvents: UIControlEvents.TouchUpInside)
    rightView.addSubview(btn2)


    let rightBtn = UIBarButtonItem(customView: rightView)
    self.navigationItem.rightBarButtonItem = rightBtn;

..

dimana:

 func doIt(sender: AnyObject!){
    let tag = sender.tag

}
ing.conti
sumber
0
    func makeCustomNavigationBar () {

        // Create the navigation bar
        let navigationBar = UINavigationBar(frame: CGRectMake(0, 20, self.view.frame.size.width, 44)) // Offset by 20 pixels vertically to take the status bar into account
        navigationBar.backgroundColor = UIColor.init(hexString: "E43037")
        navigationBar.delegate = self;

        navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
        navigationBar.shadowImage = UIImage()
        navigationBar.translucent = true

        // Create a navigation item with a title
        let navigationItem = UINavigationItem()
        navigationBar.tintColor = UIColor.whiteColor()

        navigationItem.title = "Forgot Password"
        navigationBar.titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()]

        // Create left and right button for navigation item
        let leftButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: self, action: nil)
        leftButton.action = "returnToLoginView"

        let backbuttonImageView =  UIImageView(frame: CGRectMake(0, 0, 30, 30))
        backbuttonImageView.image = UIImage(named: "nav-arrow-left")
        leftButton.image = backbuttonImageView.image
        navigationItem.leftBarButtonItem = leftButton


let rightButton = UIBarButtonItem(title: "Right", style: UIBarButtonItemStyle.Plain, target: self, action: nil)
        rightButton.action = "navigateToDashBoardView"

        let rightButtonImageView =  UIImageView(frame: CGRectMake(0, 0, 30, 30))
        rightButtonImageView.image = UIImage(named: "nav-arrow-left")
        rightButton.image = backbuttonImageView.image
        navigationItem.rightBarButtonItem = rightButton

        // Assign the navigation item to the navigation bar
        navigationBar.items = [navigationItem]

        // Make the navigation bar a subview of the current view controller
        self.view.addSubview(navigationBar)
    }
AG
sumber