创建M13Checkbox独立子类需注意哪些问题?附实现代码
嘿,你的这个TCCheckbox子类基础实现已经走对方向了!下面我来梳理下创建这类第三方控件子类时需要特别留意的几个关键点,帮你避免踩坑:
初始化逻辑的完整性
你已经覆盖了init(frame:)和init?(coder:)这两个最常用的初始化方法,并且把公共配置抽到了initialize()私有方法里,这做得很棒!要注意的是,如果M13Checkbox还有其他指定初始化器(比如某些自定义的init方法),最好也一并覆盖并调用initialize(),避免在某些场景下控件样式不生效。父类属性的重写与调用时机
你在initialize()里直接设置了boxType和tintColor,这里要确保这些属性的设置是在父类初始化完成之后进行的——你现在的写法是对的,因为先调用了super.init,再执行自己的配置。如果反过来,可能会被父类的初始化逻辑覆盖掉你的设置。另外,如果后续需要重写父类的属性(比如自定义isSelected的逻辑),一定要记得在合适的时机调用super的实现,避免破坏父类的原有行为。样式配置的可扩展性
目前你把样式写死成了圆形和白色tint,但如果后续业务需要不同样式的TCCheckbox,最好把这些配置做成可参数化的。比如可以给TCCheckbox加一个带样式参数的初始化方法,或者提供公共的配置方法:enum TCCheckboxStyle { case whiteCircle case blackSquare // 其他样式 } func configure(with style: TCCheckboxStyle) { switch style { case .whiteCircle: boxType = .circle tintColor = .white case .blackSquare: boxType = .square tintColor = .black } }这样后续复用起来更灵活。
父类方法的重写谨慎性
如果之后需要重写M13Checkbox的回调方法(比如didSelect、didDeselect),一定要先调用super的对应方法,保证父类的原有逻辑(比如状态更新、动画效果)正常执行,再添加自己的业务逻辑。比如:override func didSelect() { super.didSelect() // 这里添加你的自定义逻辑,比如发送通知、统计埋点 }IBDesignable与IBInspectable的支持(如果需要在Storyboard中使用)
如果你的TCCheckbox需要在Storyboard/XIB里可视化配置,可以给类加上@IBDesignable,并把需要配置的属性加上@IBInspectable,这样在Interface Builder里就能直接调整样式,不用跑代码看效果:@IBDesignable class TCCheckbox: M13Checkbox { @IBInspectable var isCircleType: Bool = true { didSet { boxType = isCircleType ? .circle : .square } } @IBInspectable var checkboxTintColor: UIColor = .white { didSet { tintColor = checkboxTintColor } } // ... 其他初始化和配置逻辑 }避免过度封装
只封装业务中重复使用的逻辑,不要把M13Checkbox的所有属性都重新包装一遍,那样会增加维护成本。比如如果父类已经有isSelected属性,就没必要再自己写一个tc_isSelected来包装它,直接用父类的即可。
你的现有代码已经满足基础需求啦,按照上面的注意点优化后,这个子类会更健壮、更灵活~
内容的提问来源于stack exchange,提问作者Igor




