UIBButtonItem di bilah navigasi secara terprogram?

135

Saya sudah mencari-cari solusi ini untuk sementara waktu tetapi tidak punya. mis satu solusinya

 self.navigationItem.setRightBarButtonItem(UIBarButtonItem(barButtonSystemItem: .Stop, target: self, action: nil), animated: true)

Kode ini akan menambahkan tombol dengan gambar "stop". Sama seperti ini, ada solusi lain dengan "pencarian," menyegarkan "dll. Tetapi bagaimana jika saya ingin menambahkan tombol secara terprogram dengan gambar yang saya inginkan?

Rahul Sonvane
sumber

Jawaban:

342

Gambar tombol kustom tanpa pengaturan bingkai tombol:

Anda dapat menggunakan init(image: UIImage?, style: UIBarButtonItemStyle, target: Any?, action: Selector?)untuk menginisialisasi item baru menggunakan gambar yang ditentukan dan properti lainnya.

let button1 = UIBarButtonItem(image: UIImage(named: "imagename"), style: .plain, target: self, action: Selector("action")) // action:#selector(Class.MethodName) for swift 3
self.navigationItem.rightBarButtonItem  = button1

Periksa Apple Doc ini. referensi


UIBButtonItem dengan gambar tombol khusus menggunakan bingkai tombol

UNTUK Swift 3.0

    let btn1 = UIButton(type: .custom)
    btn1.setImage(UIImage(named: "imagename"), for: .normal)
    btn1.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
    btn1.addTarget(self, action: #selector(Class.Methodname), for: .touchUpInside)
    let item1 = UIBarButtonItem(customView: btn1)

    let btn2 = UIButton(type: .custom)
    btn2.setImage(UIImage(named: "imagename"), for: .normal)
    btn2.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
    btn2.addTarget(self, action: #selector(Class.MethodName), for: .touchUpInside)
    let item2 = UIBarButtonItem(customView: btn2)  

    self.navigationItem.setRightBarButtonItems([item1,item2], animated: true)

UNTUK Swift 2.0dan lebih tua

let btnName = UIButton()
btnName.setImage(UIImage(named: "imagename"), forState: .Normal)
btnName.frame = CGRectMake(0, 0, 30, 30)
btnName.addTarget(self, action: Selector("action"), forControlEvents: .TouchUpInside)

//.... Set Right/Left Bar Button item
let rightBarButton = UIBarButtonItem()
rightBarButton.customView = btnName
self.navigationItem.rightBarButtonItem = rightBarButton

Atau cukup gunakan init (customView :) like

 let rightBarButton = UIBarButtonItem(customView: btnName)
 self.navigationItem.rightBarButtonItem = rightBarButton

Untuk Sistem UIBButtonItem

let camera = UIBarButtonItem(barButtonSystemItem: .Camera, target: self, action: Selector("btnOpenCamera"))
self.navigationItem.rightBarButtonItem = camera

Untuk mengatur lebih dari 1 item gunakan rightBarButtonItemsatau untuk sisi kirileftBarButtonItems

let btn1 = UIButton()
btn1.setImage(UIImage(named: "img1"), forState: .Normal)
btn1.frame = CGRectMake(0, 0, 30, 30)
btn1.addTarget(self, action: Selector("action1:"), forControlEvents: .TouchUpInside)
let item1 = UIBarButtonItem()
item1.customView = btn1

let btn2 = UIButton()
btn2.setImage(UIImage(named: "img2"), forState: .Normal)
btn2.frame = CGRectMake(0, 0, 30, 30)
btn2.addTarget(self, action: Selector("action2:"), forControlEvents: .TouchUpInside)
let item2 = UIBarButtonItem()
item2.customView = btn2

self.navigationItem.rightBarButtonItems = [item1,item2]

Menggunakan setLeftBarButtonItematausetRightBarButtonItem

let btn1 = UIButton()
btn1.setImage(UIImage(named: "img1"), forState: .Normal)
btn1.frame = CGRectMake(0, 0, 30, 30)
btn1.addTarget(self, action: Selector("action1:"), forControlEvents: .TouchUpInside)
self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(customView: btn1), animated: true);

Untuk swift> = 2.2 aksi harus #selector(Class.MethodName)... misalnyabtnName.addTarget(self, action: #selector(Class.MethodName), forControlEvents: .TouchUpInside)

EI Captain v2.0
sumber
Jawaban yang bagus Hanya ingin menunjukkan bahwa metode Pemilih telah diperbarui kelet camera = UIBarButtonItem(barButtonSystemItem: .Camera, target: self, action: #selector(Class.MethodName))
CodeBender
Saya menemukan bahwa jika Anda ingin tombol Anda juga menyertakan teks, Anda harus menentukan bagian CGRect. Ada beberapa contoh mengambang di sekitar SO yang tidak menentukan ini.
Micah Montoya
terima kasih atas jawaban sempurna anda. Tidak buruk menambahkan pembaruan untuk swift 4.
Milad Faridnia
38

Jauh lebih mudah dengan Swift 4atauSwift 4.2

di dalam ViewDidLoadmetode Anda , tentukan tombol Anda dan tambahkan ke bilah navigasi.

override func viewDidLoad() {
    super.viewDidLoad()

    let logoutBarButtonItem = UIBarButtonItem(title: "Logout", style: .done, target: self, action: #selector(logoutUser))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem

}

maka Anda perlu mendefinisikan fungsi yang Anda sebutkan di dalam parameter tindakan seperti di bawah ini

@objc func logoutUser(){
     print("clicked")
}

Anda perlu menambahkan @objcawalan karena masih menggunakan hal-hal yang lama (Objective C).

Jay Mayu
sumber
17

Cukup setup UIBarButtonItemdengan customView

Sebagai contoh:

  var leftNavBarButton = UIBarButtonItem(customView:yourButton)
  self.navigationItem.leftBarButtonItem = leftNavBarButton

atau gunakan setFunction:

  self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(customView: yourButton), animated: true);
Leo
sumber
1
Saya memilih jawaban Anda karena kode Anda juga berfungsi, tetapi kode Bhavin adalah solusi satu langkah, jadi saya akan menerima jawabannya. Terima kasih atas kontribusi Anda :)
Rahul Sonvane
11

Saya baru saja menemukan pertanyaan ini dan ini adalah pembaruan untuk Swift 3 dan iOS 10:

let testUIBarButtonItem = UIBarButtonItem(image: UIImage(named: "test.png"), style: .plain, target: self, action: nil)
self.navigationItem.rightBarButtonItem  = testUIBarButtonItem

Ini jelas jauh lebih cepat daripada membuat UIButton dengan semua properti dan kemudian menambahkan customView ke UIBarButtonItem.

Dan jika Anda ingin mengubah warna gambar dari biru default menjadi putih, Anda selalu dapat mengubah warna warna:

test.tintColor = UIColor.white()

PS Anda jelas harus mengubah pemilih dll untuk aplikasi Anda :)

tech4242
sumber
7

Di Swift 3.0+, secara UIBarButtonItemterprogram diatur sebagai berikut:

   override func viewDidLoad() {
        super.viewDidLoad()
        let testUIBarButtonItem = UIBarButtonItem(image: UIImage(named: "test.png"), style: .plain, target: self, action: #selector(self.clickButton))
        self.navigationItem.rightBarButtonItem  = testUIBarButtonItem
    }

   @objc func clickButton(){
            print("button click")
     }
Kushal Shrestha
sumber
3

Pengaturan LeftBarButton dengan Gambar Asli.

let menuButton = UIBarButtonItem(image: UIImage(named: "imagename").withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(classname.functionname))
self.navigationItem.leftBarButtonItem  = menuButton
Sudhi 9135
sumber
2

Saya memiliki masalah yang sama dan saya telah membaca jawaban di topik lain kemudian saya memecahkan cara serupa lainnya. Saya tidak tahu mana yang lebih efektif. masalah serupa

//play button

@IBAction func startIt(sender: AnyObject) {
    startThrough();
};

//play button

func startThrough() {
    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateTime"), userInfo: nil, repeats: true);

    let pauseButton = UIBarButtonItem(barButtonSystemItem: .Pause, target: self, action: "pauseIt");
    self.toolBarIt.items?.removeLast();
    self.toolBarIt.items?.append( pauseButton );
}

func pauseIt() {
    timer.invalidate();

    let play = UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: "startThrough");
    self.toolBarIt.items?.removeLast();
    self.toolBarIt.items?.append( play );
}
AngelThread
sumber
1

Ini adalah hal gila dari apel. Ketika Anda mengatakan self.navigationItem.rightBarButtonItem.title maka ia akan mengatakan nol pada GUI itu menunjukkan Edit atau Simpan. Orang baru seperti saya akan membutuhkan banyak waktu untuk men-debug perilaku ini.

Ada persyaratan bahwa Item akan menampilkan Edit dalam beban pertama lalu pengguna mengetuknya. Item tersebut akan berubah menjadi Simpan judul. Untuk mengarsipkan ini, saya lakukan seperti di bawah ini.

// lihat apakah memuat akan mengatakan Edit judul

private func loadRightBarItem() {
    let logoutBarButtonItem = UIBarButtonItem(title: "Edit", style: .done, target: self, action: #selector(handleEditBtn))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem
}

// ketuk Edit item akan berubah ke Simpan judul

@objc private func handleEditBtn() {
    print("clicked on Edit btn")
    let logoutBarButtonItem = UIBarButtonItem(title: "Save", style: .done, target: self, action: #selector(handleSaveBtn))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem
    blockEditTable(isBlock: false)
}

// ketuk Simpan item akan menampilkan Edit judul

@objc private func handleSaveBtn(){
    print("clicked on Save btn")
    let logoutBarButtonItem = UIBarButtonItem(title: "Edit", style: .done, target: self, action: #selector(handleEditBtn))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem

    saveInvitation()
    blockEditTable(isBlock: true)

}
coders
sumber
1

iOS 11

Mengatur tombol khusus menggunakan batasan:

let buttonWidth = CGFloat(30)
let buttonHeight = CGFloat(30)

let button = UIButton(type: .custom)
button.setImage(UIImage(named: "img name"), for: .normal)
button.addTarget(self, action: #selector(buttonTapped(sender:)), for: .touchUpInside)
button.widthAnchor.constraint(equalToConstant: buttonWidth).isActive = true
button.heightAnchor.constraint(equalToConstant: buttonHeight).isActive = true

self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(customView: button)
Achyut Sagar
sumber
0
func viewDidLoad(){
let homeBtn: UIButton = UIButton(type: UIButtonType.custom)

        homeBtn.setImage(UIImage(named: "Home.png"), for: [])

        homeBtn.addTarget(self, action: #selector(homeAction), for: UIControlEvents.touchUpInside)

        homeBtn.frame = CGRect(x: 0, y: 0, width: 30, height: 30)

        let homeButton = UIBarButtonItem(customView: homeBtn)


        let backBtn: UIButton = UIButton(type: UIButtonType.custom)

        backBtn.setImage(UIImage(named: "back.png"), for: [])

        backBtn.addTarget(self, action: #selector(backAction), for: UIControlEvents.touchUpInside)

        backBtn.frame = CGRect(x: -10, y: 0, width: 30, height: 30)

        let backButton = UIBarButtonItem(customView: backBtn)
        self.navigationItem.setLeftBarButtonItems([backButton,homeButton], animated: true)
}

}
Sai kumar Reddy
sumber