UIBarButtonItem programlı olarak gezinti çubuğunda mı?


136

Bir süredir bu çözümü araştırıyorum ama bulamadım. örneğin bir çözüm

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

Bu kod, "durdur" resmine sahip bir düğme ekleyecektir. Tıpkı bunun gibi, "arama", "yenileme" vb. İle başka çözümler de var. Peki ya istediğim görüntüye programlı olarak bir düğme eklemek istersem?

Yanıtlar:


344

Düğme çerçevesini ayarlamadan özel düğme görüntüsü:

init(image: UIImage?, style: UIBarButtonItemStyle, target: Any?, action: Selector?)Belirtilen görüntüyü ve diğer özellikleri kullanarak yeni bir öğeyi başlatmak için kullanabilirsiniz .

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

Bu Apple Dokümanına bakın. referans


Düğme çerçevesi kullanarak özel düğme görüntüsüne sahip UIBarButtonItem

İÇİN 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)

İÇİN Swift 2.0ve daha yaşlı

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

Ya da sadece kullanmak :) (customView init gibi

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

Sistem UIBarButtonItem için

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

1 öğeden fazlasını ayarlamak için rightBarButtonItemsveya sol taraf için kullanınleftBarButtonItems

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]

setLeftBarButtonItemVeya kullanmasetRightBarButtonItem

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

Hızlı> = 2.2 için eylem #selector(Class.MethodName)... olmalıdır , örneğinbtnName.addTarget(self, action: #selector(Class.MethodName), forControlEvents: .TouchUpInside)


Mükemmel cevap. Sadece Seçici yönteminin güncellendiğini let camera = UIBarButtonItem(barButtonSystemItem: .Camera, target: self, action: #selector(Class.MethodName))
belirtmek isterim

Düğmenizin metni de içermesini istiyorsanız, CGRect bölümünü belirtmeniz gerektiğini anladım. SO'da bunu belirtmeyen bazı örnekler var.
Micah Montoya

mükemmel cevabınız için teşekkürler Swift 4 için güncelleme eklemek fena değil.
Milad Faridnia

38

Swift 4Veya ile çok daha kolaySwift 4.2

ViewDidLoadyönteminizin içinde düğmenizi tanımlayın ve gezinme çubuğuna ekleyin.

override func viewDidLoad() {
    super.viewDidLoad()

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

}

eylem parametresi içinde bahsettiğiniz işlevi aşağıdaki gibi tanımlamanız gerekir

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

@objcHala eski şeylerden (Hedef C) yararlandığı için öneki eklemeniz gerekir .


17

Sadece kurun UIBarButtonItem customView ile yapın

Örneğin:

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

veya şunu kullanın setFunction:

  self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(customView: yourButton), animated: true);

1
Kodunuz da çalıştığı için cevabınızı oylayacağım ama Bhavin'in kodu tek seferlik bir çözüm olduğu için cevabını kabul edeceğim. Katkınız için teşekkürler dostum :)
Rahul Sonvane

11

Bu soruya biraz önce rastladım ve işte Swift 3 ve iOS 10 için bir güncelleme:

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

Kesinlikle, tüm özelliklerle UIButton oluşturmaktan ve ardından customView'i UIBarButtonItem'e eklemekten çok daha hızlıdır.

Ve görüntünün rengini varsayılan maviden örneğin beyaza değiştirmek isterseniz, her zaman renk tonunu değiştirebilirsiniz:

test.tintColor = UIColor.white()

Not: Uygulamanız için seçiciyi vb. Değiştirmelisiniz :)


7

Swift 3.0+ sürümünde, UIBarButtonItemaşağıdaki gibi programlı olarak ayarlayın:

   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")
     }

3

LeftBarButton'ı Orijinal Görüntü ile Ayarlama.

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

2

Aynı sorunu yaşıyorum ve başka bir konudaki cevapları okudum, sonra benzer bir şekilde çözüyorum. Hangisinin daha etkili olduğunu bilmiyorum. benzer sorun

//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 );
}

1

Bu çılgınca bir elma. Self.navigationItem.rightBarButtonItem.title dediğinizde, GUI üzerindeyken Düzenle veya Kaydet gösterirken nil yazar. Daha taze benden hoşlananlar, bu davranışta hata ayıklamak için çok zaman alacak.

Öğenin ilk yüklemede Düzenle göstermesi ve ardından kullanıcı üzerine dokunması için bir gereklilik vardır. Başlığı Kaydet olarak değişecektir. Bunu arşivlemek için aşağıdaki gibi yaptım.

// görünüm yüklendi, Başlığı düzenle diyecek

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

// Öğeyi düzenle'ye dokunun Başlığı kaydet olarak değişecek

@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)
}

// Öğeyi kaydet seçeneğine dokunun Başlığı düzenle görüntülenecek

@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)

}

1

iOS 11

Kısıtlama kullanarak özel bir düğme ayarlama:

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)

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)
}

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.