Сделать заголовок навигационной панели кликабельным быстрым

Я хотел бы сделать заголовок navigationbar доступным для просмотра. Когда пользователь нажимает на него, он должен выполнить сеанс. Но я не знаю, как это сделать.

Я попробовал следующее, чтобы получить заголовок и применить к нему жест Tap.

var subviews  = self.navigationController?.navigationBar.subviews
        if let subviews = subviews {
            // Better check for array length before accessing to the 1st element
            var subview = subviews [0]
        }

но он дает мне ошибку Variable subview inferred to have type AvyObject, which may be unexpected

Ответы

Ответ 1

Еще один подход для добавления кнопки в качестве заголовка навигационного контроллера.

Вам нужно установить вид заголовка навигационного элемента на объект кнопки

Создать объект кнопки в методе viewDidLoad():

Swift 3.0 Edit

let button =  UIButton(type: .custom)
button.frame = CGRect(x: 0, y: 0, width: 100, height: 40)
button.backgroundColor = UIColor.red
button.setTitle("Button", for: .normal)
button.addTarget(self, action: #selector(self.clickOnButton), for: .touchUpInside)
self.navigationItem.titleView = button

Здесь вы можете увидеть, что в последней строке кнопка напрямую установлена ​​на titleView of navigationItem, которая добавит кнопку в центре панели навигации.

Действие метода для кнопки ниже:

func clickOnButton(button: UIButton) {
}

Ответ 2

Ответ Kampai обновлен для Swift 3:

let button =  UIButton(type: .custom)
button.frame = CGRect(x: 0, y: 0, width: 100, height: 40)
button.setTitle("Button", for: .normal)
button.addTarget(self, action: #selector(self.clickOnButton), for: .touchUpInside)
self.navigationItem.titleView = button

Ответ 3

Я могу подтвердить, что ответ Kampai обновлен для Swift 3: " РАБОТАЕТ ТАКЖЕ для Xcode 9/iOS11:

private func setTouchable(title: String){
            let button =  UIButton(type: .custom)
            button.frame = CGRect(x: 0, y: 0, width: 80, height: 40)
            button.setTitle(title, for: .normal)
            button.addTarget(self, 
            action: #selector(self.btnAction),
            for: .touchUpInside)
            self.navigationItem.titleView = button
        }



        @objc func btnAction(sender: Any){
            print("Got it!");
        }


....
// for example in viewDidLoad:
            setTouchable(title: "TOUCHME")

Ответ 4

Чтобы избавиться от этой ошибки, укажите тип для константы if let. Я также рекомендую изменить это имя константы if let, так как оно совпадает с именем, уже объявленным в предыдущей строке.

var subviews  = self.navigationController?.navigationBar.subviews
if let subviewArray:NSArray = subviews {
     // Better check for array length before accessing to the 1st element
     var subview:UILabel = subviewArray[0] // <-- If the subview a UILabel
}