iOS Swift开发中UIButton的currentTitle返回nil但titleLabel.text正常是何原因
两个属性的本质差异
currentTitle是UIButton的状态绑定属性:它的返回值完全依赖你通过setTitle(_:for:)方法为按钮**当前所处状态(normal/highlighted/selected/disabled等)**配置的标题值,如果对应状态没有提前设置过标题,就会直接返回nil。titleLabel.text是直接访问按钮内部UILabel的实时渲染文本:只要这个label当前正在展示某段文本,不管这段文本是通过按钮状态配置设置的,还是直接修改label属性、xib硬改内部label值得到的,都会返回当前展示的内容。
常见触发该问题的场景
- 你直接修改了
titleLabel?.text来设置按钮标题,没有调用setTitle(_:for:)方法,这种情况下按钮没有给任何状态存储对应的标题值,currentTitle自然返回nil。 - 在xib/Storyboard中直接修改了按钮内部UILabel的文本,没有在按钮的属性检查器中为对应状态(比如Default状态)设置Title。
- 你只为按钮的某一种状态(比如normal)设置了标题,而按钮当前处于未配置过标题的状态(比如selected),此时
currentTitle返回nil,但titleLabel可能还保留着上一个状态的渲染文本。
修复方案
所有按钮标题的设置统一使用setTitle(_:for:)方法,不要直接修改titleLabel.text;使用xib/Storyboard时,确保在按钮的Title配置项中为对应状态设置文本,不要直接修改内部Label的属性,即可保证currentTitle返回值正常。
相关测试代码
@IBAction func numBtnPress(_ sender: UIButton) { print(sender.titleLabel?.text) print(sender.currentTitle) }
问题截图

内容的提问来源于stack exchange,提问作者liangdapang
相关产品推荐
相关产品推荐

