我正在编写一个自定义UI控件,并且对初始化(尤其是依赖于控件的委托)的标准实践感到好奇。像大多数控件一样,我的控件依赖委托来提供有关如何呈现自身的重要信息。以编程方式和从NIB两种方式初始化自定义控件
当从NIB中使用控件时,将正确调用initWithCoder:
和awakeFromNib
方法,并通过IBOutlet
很好地设置代理。 awakeFromNib
调用一个名为setupControl
的辅助方法,该方法与委托进行交互以设置我的控件。生活是美好的!
但是,当我使用initWithFrame:
手动创建控件时,显然不会调用awakeFromNib
。我很好奇其他开发人员如何处理支持IB和编程控制的创建。我可以看到一对夫妇的技术支持的编程案例:
- 强制开发者调用
initWithFrame:
,其次为setDelegate:
,其次是setupControl
。不是太繁琐,但确实暴露了我的控制的内部工作(即他们必须知道约setupControl
) - 修改
initWithFrame:
方法以采取委托。这确实封装了更多的内部工作,但是,我不确定这是一个特别常用的习惯用法(似乎基于委托响应操作子视图通常延迟到视图的生命周期稍后,而不是在初始化程序中) - 重写
setDelegate:
访问器以调用setupControl
方法。这不是一个很大的粉丝,因为它通过副作用来编程。
只是想我会把它扔出去看看我忽略了哪些技术。思考?
谢谢。 Craig
但是,当你说从'initWithFrame:'调用'awakeFromNib'没有问题时,在编程世界中,通过IBOutlet设置。它会在代码中手动设置 - 这是可以的,但是在调用了'initWithFrame:'之后会发生**,这意味着'initWithFrame:'不能可靠地调用'awakeFromNib',因为它依赖于委托被设置。这是我正在与之搏斗的鸡/鸡蛋困境。 – 2013-04-10 04:19:10
据我所知,你的控制依赖于它的初始化和设置阶段的委托?代表是可选的,并且不需要为了初始化任何东西。你在这里有一个设计问题。 – Pyroh 2013-04-10 08:28:38