UIBarButtonItem в навігаційній панелі програмно?


135

Я деякий час розглядав це рішення, але не маю жодного. наприклад, одне рішення є

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

Цей код додасть кнопку із зображенням "стоп". Окрім цього, є й інші рішення з "пошуком, оновленням" тощо. Але що робити, якщо я хочу додати кнопку програмно до зображення, яке я хочу?

Відповіді:


342

Зображення спеціальної кнопки без налаштування кадру кнопки:

Ви можете використовувати init(image: UIImage?, style: UIBarButtonItemStyle, target: Any?, action: Selector?)для ініціалізації нового елемента за допомогою вказаного зображення та інших властивостей.

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

Перевірте цей Apple Doc. довідник


UIBarButtonItem зі спеціальним зображенням кнопки за допомогою рамки кнопок

ЗА 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)

ЗА Swift 2.0і старше

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

Або просто використовувати init (customView :), як

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

Для системи UIBarButtonItem

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

Для встановлення більше ніж 1 елемент використовується rightBarButtonItemsабо для лівого бокуleftBarButtonItems

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]

Використання setLeftBarButtonItemабоsetRightBarButtonItem

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

Для swift> = 2.2 дія повинна бути #selector(Class.MethodName)... для напрbtnName.addTarget(self, action: #selector(Class.MethodName), forControlEvents: .TouchUpInside)


Чудова відповідь. Просто хочу зазначити, що метод Selector був оновлений, хоча доlet camera = UIBarButtonItem(barButtonSystemItem: .Camera, target: self, action: #selector(Class.MethodName))
CodeBender

Я виявив, що якщо ви хочете, щоб ваша кнопка містила також текст, ви повинні вказати частину CGRect. Є кілька прикладів, що плавають навколо SO, які не вказують цього.
Міхей Монтоя

дякую за ідеальну відповідь. Непогано додати оновлення для швидкого 4.
Мілад Фарідня

38

Набагато простіше з Swift 4абоSwift 4.2

всередині вашого ViewDidLoadметоду визначте свою кнопку та додайте її до панелі навігації.

override func viewDidLoad() {
    super.viewDidLoad()

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

}

то вам потрібно визначити функцію, про яку ви згадали всередині параметра дії, як показано нижче

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

Потрібно додати @objcпрефікс, оскільки він все ще використовує застарілі речі (Завдання C).


17

Просто налаштування за UIBarButtonItemдопомогою customView

Наприклад:

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

або використовувати setFunction:

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

1
Я голосую за вашу відповідь, як працює і ваш код, але код Бхавіна - це рішення, яке було зроблено за один знімок, тому я прийму його відповідь. Дякуємо за ваш товариш :)
Рахул Сонване

11

Я просто натрапив на це питання, і ось оновлення для Swift 3 та iOS 10:

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

Це, безумовно, набагато швидше, ніж створення UIButton з усіма властивостями, а потім згодом додавання customView до UIBarButtonItem.

І якщо ви хочете змінити колір зображення з синього за замовчуванням на напр. Білий, ви завжди можете змінити колір відтінку:

test.tintColor = UIColor.white()

PS Ви, очевидно, повинні змінити селектор тощо для свого додатка :)


7

У Swift 3.0+ UIBarButtonItemпрограмно налаштовано так:

   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 з оригінальним зображенням.

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

2

У мене те саме питання, і я прочитав відповіді в іншій темі, тоді я вирішую інший подібний спосіб. Я не знаю, що є більш ефективним. подібне питання

//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

Це божевільна річ із яблука. Коли ви скажете self.navigationItem.rightBarButtonItem.title, тоді він буде нульовим, тоді як на графічному інтерфейсі відображатиметься Правка або Зберегти. Свіжіші подобаються мені знадобиться багато часу, щоб налагодити цю поведінку.

Існує вимога, що Елемент буде відображати Правка під час завантаження, а потім користувач натискає на нього. Він зміниться на Зберегти заголовок. Щоб заархівувати це, я зробив як нижче.

// view did load завантажиться редагувати заголовок

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

// натисніть Редагувати елемент зміниться на Зберегти заголовок

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

// натисніть Зберегти елемент, відобразиться Редагувати заголовок

@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

Встановлення користувацької кнопки за допомогою обмеження:

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

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.