使用三元运算符设置UIButton图片点击无切换效果如何解决?
问题根因分析
- 未修改按钮的
isSelected状态:现有代码仅判断isSelected的当前值,点击事件中没有翻转该属性,按钮状态永远停留在初始值,导致逻辑分支永远固定
- 未修改按钮的
- 图片设置逻辑错误:当前逻辑是给按钮的不同状态(normal/selected)分别设置图片,但没有切换按钮的实际展示状态,界面永远只会展示normal状态对应的图片
- 缺失密码输入框属性同步逻辑:现有代码没有修改
UITextField的isSecureTextEntry属性,仅处理按钮图片,无法实现密码显隐的核心需求
- 缺失密码输入框属性同步逻辑:现有代码没有修改
修复方案
推荐更简洁的实现:提前给按钮不同状态绑定对应图片,点击时仅需翻转状态即可自动切换图片,同时同步输入框属性:
1. 修改按钮初始化逻辑
private lazy var button: UIButton = { let view = UIButton() view.translatesAutoresizingMaskIntoConstraints = false // 提前绑定不同状态对应的图片 view.setImage(secureImage, for: .selected) // 选中状态:密码可见,展示睁眼图 view.setImage(unSecureImage, for: .normal) // 未选中状态:密码隐藏,展示闭眼图 view.addTarget(self, action: #selector(toggle), for: .touchUpInside) return view }()
2. 重写toggle点击方法
@objc func toggle(_ sender: UIButton) { // 翻转按钮选中状态,自动切换对应图片 sender.isSelected = !sender.isSelected // 同步密码输入框的显隐属性,yourTextField替换为你实际的输入框变量名 yourTextField.isSecureTextEntry = !sender.isSelected }
3. 初始调用逻辑保持不变
self.toggle(button)
额外注意事项
- 提前确认
secureImage、unSecureImage已经正确初始化,不存在为nil的情况 - 如果cell存在复用场景,需要在
prepareForReuse方法中同步重置按钮选中状态和输入框的isSecureTextEntry属性,避免复用出现展示异常
内容的提问来源于stack exchange,提问作者David Henry
相关产品推荐
相关产品推荐

