Сделать заголовок навигационной панели кликабельным быстрым
Я хотел бы сделать заголовок 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
}