无法更改 UINavigationItem 中 UIButton 的标题

Posted

技术标签:

【中文标题】无法更改 UINavigationItem 中 UIButton 的标题【英文标题】:Cant change title of UIButton in UINavigationItem 【发布时间】:2015-01-28 21:28:47 【问题描述】:

ios 8 的 Swift 中,我有一个 UIViewController 使用 UIView() 作为它的导航项。

视图包含一个子视图 - 一个 UIButton,我无法成功调用 setTitle:forState: on

这是我的代码

playButton.setTitle("Play", forState: UIControlState.Normal)
playButton.tintColor = UIColor.grayColor()
playButton.titleLabel?.font = UIFont(name: "LucidaSansUnicode", size: 20)
playButton.addTarget(self, action: "playPressed", forControlEvents: UIControlEvents.TouchUpInside)        
playButton.setTranslatesAutoresizingMaskIntoConstraints(false)
transportBar.backgroundColor = UIColor.clearColor().colorWithAlphaComponent(0.0)
transportBar.addSubview(playButton)
transportBar.addConstraint(NSLayoutConstraint(item: transportBar, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: playButton, attribute: NSLayoutAttribute.CenterX, multiplier: 1.0, constant: 0.0))
transportBar.addConstraint(NSLayoutConstraint(item: transportBar, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: playButton, attribute: NSLayoutAttribute.CenterY, multiplier: 1.0, constant: 0.0))
navigationItem.titleView = transportBar

按钮最初效果很好 - 设置了“播放”标题,调用 playPushed(),我可以成功地在按钮上添加和删除目标。

为什么标题不变???

此外,当设备方向(和导航栏)旋转时,按钮的 textLabel 最终会自行更新!更新按钮的标题后,是否可以向 UINavigationController 发送一些消息????我试过 self.navigationController?.navigationBar.setNeedsDisplay()

我尝试过查看堆栈溢出,在 setTitle:forState: 调用周围完成了诸如 place enabled = false/true 之类的操作。我记得在 transportBar、self.view 和 navigationItem.titleView 上也尝试过 layoutSubviews()!

有什么线索吗?感谢您的帮助!

下面添加了我的 playPressed() 函数,在 TouchUpInside 上触发:

func playPressed() 
    playButton.setTitle("Stop", forState: UIControlState.Normal)
    playButton.removeTarget(self, action: "playPressed", forControlEvents: UIControlEvents.TouchUpInside)
    playButton.addTarget(self, action: "stopPressed", forControlEvents: UIControlEvents.TouchUpInside)

【问题讨论】:

但是您没有在代码中再次设置标题。正如您所说,您只需将标题设置为“播放”一次即可。 是的,我在按下按钮时再次设置它。在添加和删除目标时,这确实有效 请向我们展示你的 playPushed 方法。 我已将它添加到我的问题中。有一个类似的 stopPressed() 函数 【参考方案1】:

我想,也许你的 String 会被 UIButton 本身的 attributedString 方法覆盖。尝试设置属性字符串:

var attri = NSAttributedString(string: "Your String")
button.setAttributedTitle(attri, forState: UIControlState.Normal)

【讨论】:

不,这没有成功...你看到我关于方向的最后评论了吗?

以上是关于无法更改 UINavigationItem 中 UIButton 的标题的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 UINavigationItem 的背景颜色?

如何更改 UINavigationItem 字体?

处理容器控制器中子视图控制器的 UINavigationItem 更改的最佳实践?

如何在 UINavigationItem 下添加选项卡?

UINavigationItem 上的 touchUpInside 事件

未显示自定义 UINavigationItem 上的标题