使用sender.title(for: .selected)获取按钮标题返回nil报错问题
问题描述
- 学习iOS开发时按照教程编写按钮响应演示代码,核心实现如下:
import UIKit class ViewController: UIViewController { @IBAction func buttonPressed(_ sender: UIButton) { let title = sender.title(for: .selected)! let text = "\(title) buttion pressed" out.text = text } @IBOutlet weak var out: UILabel! }
- 运行环境:Xcode 13.4
- 已确认的配置:
- 已通过拖拽操作正确将按钮与
buttonPressed响应方法关联 - 已在Storyboard中双击按钮,设置按钮默认标题为
left - 移除代码中的强制解包符
!后,标签控件可正常显示nil button pressed,IBOutlet连接正常
- 已通过拖拽操作正确将按钮与
- 异常表现:模拟器中点击按钮后触发报错
Unexpectedly found nil while unwrapping an Optional value,报错定位在let title = sender.title(for: .selected)!行,无法正确获取到按钮标题。
问题原因
你在Storyboard中双击按钮输入设置的标题,属于按钮**normal(默认正常)状态**下的配置,但代码中调用sender.title(for: .selected)获取的是按钮selected(选中)状态下的标题。你从未给按钮的选中状态单独设置过标题,该方法自然返回nil,对nil做强制解包就会触发崩溃。
解决方法
直接将获取标题时传入的状态参数从.selected改为.normal即可,修改后的响应方法代码如下:
@IBAction func buttonPressed(_ sender: UIButton) { let title = sender.title(for: .normal)! let text = "\(title) button pressed" out.text = text }
补充:如果你确实需要获取选中状态下的按钮标题,需要先为该状态单独配置标题:可以在Storyboard右侧属性检查器中找到State Config选项,切换到Selected后输入对应标题;也可以通过代码sender.setTitle("对应标题", for: .selected)提前设置,否则无法获取到该状态的标题值。
内容的提问来源于stack exchange,提问作者ge1mina023
相关产品推荐
相关产品推荐

