我正在编写一个自定义 UI 控件,并且对围绕初始化的标准做法(特别是对控件委托的依赖)感到好奇。像大多数控件一样,我的控件依赖委托来提供有关如何呈现自身的重要信息。
当从 NIB 中使用控件时,会正确调用initWithCoder:
和awakeFromNib
方法,并且可以通过IBOutlet
. awakeFromNib
调用一个辅助方法setupControl
,该方法与委托交互以设置我的控件。生活是美好的!
但是,当我使用 , 手动创建控件时initWithFrame:
,显然awakeFromNib
不会被调用。我很好奇其他开发人员如何处理支持 IB 和编程控件创建的问题。我可以看到一些支持程序化案例的技术:
- 强制开发人员调用
initWithFrame:
,然后是setDelegate:
,然后是setupControl
。不太繁重,但确实暴露了我控制的内部运作(即他们必须知道setupControl
) - 修改
initWithFrame:
方法以获取委托。这确实更多地封装了内部工作,但是,我不确定这是一个特别常用的习惯用法(并且似乎基于委托响应操作子视图通常会推迟到视图生命周期的稍后时间,而不是在初始化程序中) - 覆盖
setDelegate:
访问器以调用该setupControl
方法。不是这个的忠实粉丝,因为它带有副作用编程的味道。
只是想我会把它扔在那里看看我忽略了哪些技术。想法?
谢谢。克雷格