使导航栏标题可点击的 Swift

23

我希望将导航栏标题变为可点击。当用户点击它时,应该执行一个segue。但是我不知道如何做到这一点。

我尝试了以下内容来获取标题并将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]
        }

但是它给了我一个错误:变量subview推断为类型AvyObject,这可能是意外的

3个回答

79

另一种作为导航控制器标题添加按钮的方法。

您需要将导航项标题视图设置为您的按钮对象

viewDidLoad()方法中创建按钮对象:

Swift 4.0编辑

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

在最后一行中,您可以看到按钮直接设置为navigationItemtitleView,这将在导航栏的中心添加按钮。

按钮的操作方法如下:

@objc func clickOnButton() {
}

1
我尝试了几种方法,比如使用UILabel和轻拍手势,但最终发现这种解决方案是最干净、最简单和最高效的方式。 - Bigair
如果您喜欢故事板:您还可以添加一个IBOutlet,然后将titleView设置为此IBOutlet。self.navigationItem.titleView = titleButton - Pbk
1
非常感谢您。 - Umair_UAS

3

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

0
为了消除这个错误,请为您的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
}

它仍然给我同样的问题。 - Atif Farrukh
它要求我将其更改为 subview: AnyObject - Atif Farrukh
@AtifFarrukh 是的,它要求你将其更改为subview:AnyObject只是一个警告,但我个人在运行该代码时没有错误。这其中一定还有更多的问题... - Lyndsey Scott
所以我刚清理了我的项目,现在它给我警告。但是我不能启用subview.userInteractionEnabled = true;它会报错,说AnyObject没有名为userInteractionEnabled的成员 - Atif Farrukh
@AtifFarrukh 既然您已经接受了那个答案,我认为您已经找到了解决方案,但是您应该将其更改为“subview: WhateverObjectTheSubviewIs”而不是更改为“subview:AnyObject”。例如,如果它是一个UILabel,则为subview:UILabel - Lyndsey Scott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接