2013-04-09 61 views
0

我正在编写一个自定义UI控件,并且对初始化(尤其是依赖于控件的委托)的标准实践感到好奇。像大多数控件一样,我的控件依赖委托来提供有关如何呈现自身的重要信息。以编程方式和从NIB两种方式初始化自定义控件

当从NIB中使用控件时,将正确调用initWithCoder:awakeFromNib方法,并通过IBOutlet很好地设置代理。 awakeFromNib调用一个名为setupControl的辅助方法,该方法与委托进行交互以设置我的控件。生活是美好的!

但是,当我使用initWithFrame:手动创建控件时,显然不会调用awakeFromNib。我很好奇其他开发人员如何处理支持IB和编程控制的创建。我可以看到一对夫妇的技术支持的编程案例:

  • 强制开发者调用initWithFrame:,其次为setDelegate:,其次是setupControl。不是太繁琐,但确实暴露了我的控制的内部工作(即他们必须知道约setupControl
  • 修改initWithFrame:方法以采取委托。这确实封装了更多的内部工作,但是,我不确定这是一个特别常用的习惯用法(似乎基于委托响应操作子视图通常延迟到视图的生命周期稍后,而不是在初始化程序中)
  • 重写setDelegate:访问器以调用setupControl方法。这不是一个很大的粉丝,因为它通过副作用来编程。

只是想我会把它扔出去看看我忽略了哪些技术。思考?

谢谢。 Craig

回答

0

第一个: -awakeFromNib自动发送到控件一旦NIB完全加载。这意味着一旦整个UI被封装在NIB中,Cocoa会发送-awakeFromNib到所有UI组件。加载后发送此消息的唯一原因是为了避免无IBOutlet。 通常情况下,如果以编程方式添加控件,则在NIB解包和加载所有UI项目(假设将IBOutlet连接到您的自定义控件)后完成。因此在您的-initWithFrame:方法结束时,不存在潜在的问题-awakeFromNib

And: 当以编程方式创建控件时,每个人都希望调用-setDelegate:-initWithFrame: + -setDelegate:不是为了获得我认为创建的功能控件;)

+0

但是,当你说从'initWithFrame:'调用'awakeFromNib'没有问题时,在编程世界中,通过IBOutlet设置。它会在代码中手动设置 - 这是可以的,但是在调用了'initWithFrame:'之后会发生**,这意味着'initWithFrame:'不能可靠地调用'awakeFromNib',因为它依赖于委托被设置。这是我正在与之搏斗的鸡/鸡蛋困境。 – 2013-04-10 04:19:10

+0

据我所知,你的控制依赖于它的初始化和设置阶段的委托?代表是可选的,并且不需要为了初始化任何东西。你在这里有一个设计问题。 – Pyroh 2013-04-10 08:28:38

相关问题