it-roy-ru.com

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

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

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

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

17
Atif Farrukh

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

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

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

Swift 4.0 Edit

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

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

Метод действия для кнопки ниже:

@objc func clickOnButton() {
}
57
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
hashemi

Чтобы избавиться от этой ошибки, укажите тип константы 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's a UILabel
}
0
Lyndsey Scott