UIButton setImage无即时效果?设置selected状态图片为nil后断言触发问题
问题本质
你碰到的问题源于UIButton的状态图像继承逻辑:
- 调用
setImage(nil, for: .selected)不是把该状态的图像设为nil,而是清除这个状态下的自定义图像配置。 - 当你调用
image(for: .selected)时,如果.selected状态没有专属图像(包括被你设为nil清除了配置),UIButton会自动 fallback 到优先级更低的状态(比如.normal)的图像。如果.normal状态原本有图像,这个方法就会返回那张图,而非nil,直接导致断言失败。
你的假设错误
你以为setImage(nil, for: .selected)会让.selected状态的图像直接变成nil,但实际上这个操作只是移除该状态的专属设置,UIButton会继承其他状态的图像来填充这个状态的显示。
验证与修正示例
如果要让.selected状态的图像确实为nil,得确保没有更低优先级的状态提供图像,比如先清除.normal状态的图像:
button.setImage(nil, for: .normal) button.isSelected = true button.setImage(nil, for: .selected) assert(button.image(for: .selected) === nil) // 此时断言会成功
或者,如果你只是想确认.selected状态是否有专属图像设置,不能直接用image(for:),因为它会返回继承来的图像——这种情况你可能需要自己维护一个状态图像的映射表来追踪配置。
内容的提问来源于stack exchange,提问作者Anton Tropashko
相关产品推荐
相关产品推荐

