0

我正在编写一个自定义 UI 控件,并且对围绕初始化的标准做法(特别是对控件委托的依赖)感到好奇。像大多数控件一样,我的控件依赖委托来提供有关如何呈现自身的重要信息。

当从 NIB 中使用控件时,会正确调用initWithCoder:awakeFromNib方法,并且可以通过IBOutlet. awakeFromNib调用一个辅助方法setupControl,该方法与委托交互以设置我的控件。生活是美好的!

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

  • 强制开发人员调用initWithFrame:,然后是setDelegate:,然后是setupControl。不太繁重,但确实暴露了我控制的内部运作(即他们必须知道setupControl
  • 修改initWithFrame:方法以获取委托。这确实更多地封装了内部工作,但是,我不确定这是一个特别常用的习惯用法(并且似乎基于委托响应操作子视图通常会推迟到视图生命周期的稍后时间,而不是在初始化程序中)
  • 覆盖setDelegate:访问器以调用该setupControl方法。不是这个的忠实粉丝,因为它带有副作用编程的味道。

只是想我会把它扔在那里看看我忽略了哪些技术。想法?

谢谢。克雷格

4

1 回答 1

0

首先: -awakeFromNibNIB 完全加载后自动发送到控件。这意味着一旦在 NIB 中封装的整个 UI 被加载,Cocoa 就会发送-awakeFromNib到所有 UI 组件。它在加载后发送它的唯一原因是避免 nil IBOutlet。通常,如果您以编程方式添加控件,则在 NIB 解包和加载所有 UI 项之后完成(假设您将 IBOutlet 连接到自定义控件)。-awakeFromNib因此,在您的方法结束时调用没有潜在的问题-initWithFrame:

并且:每个人都希望-setDelegate:在以编程方式创建控件时调用。-initWithFrame:+-setDelegate:并不是为了创建一个功能控件,我认为 ;)

于 2013-04-09T17:38:59.483 回答