自定义UIButton子类在Storyboard设标题时setTitle等方法未被调用,求解答
问题
我有一个CustomButton: UIButton子类,重写了setTitle:forState:和setAttributedTitle:forState:方法。当我在Storyboard文件中使用该按钮并通过Storyboard设置文本时,子类中的setTitle和setAttributedTitle方法均未被调用。想请教:Storyboard是否应该调用子类的这些方法,还是当标题非通过代码设置时仅调用基类UIButton的方法?
解答
当通过Storyboard设置UIButton的标题时,系统确实应该调用你子类中重写的setTitle:forState:或setAttributedTitle:forState:方法——前提是你的子类正确关联到了Storyboard中的按钮实例。
如果没被调用,大概率是以下几个常见原因:
- 子类关联错误:检查Storyboard中按钮的Class属性是否准确设置为
CustomButton,别写成默认的UIButton,拼写错误也容易踩坑。 - 初始化方法未正确调用父类实现:Storyboard加载控件用的是
initWithCoder:,如果你的子类重写了这个方法但没加[super initWithCoder:aDecoder];,会打乱系统内部的属性设置流程,导致标题setter不触发。务必保证父类初始化逻辑被执行。 - UIKit底层优化(罕见情况):极少数场景下,UIKit可能会直接访问标题的底层存储而非走setter方法(比如IB加载时的优化)。这种情况可以换个思路:在
awakeFromNib里手动获取Storyboard设置的标题(比如[self titleForState:UIControlStateNormal]),再执行你的自定义逻辑;或者重写titleForState:来拦截获取操作。
你可以先做个基础验证:在子类的initWithCoder:和awakeFromNib里加日志打印,确认按钮实例确实是CustomButton类型。如果实例没问题但setter还是没触发,优先在awakeFromNib里补全自定义标题处理逻辑即可。
内容的提问来源于stack exchange,提问作者Joe Tam
相关产品推荐
相关产品推荐

