以编程方式和NIB初始化自定义控件

时间:2013-04-09 00:49:48

标签: macos cocoa nsview awakefromnib

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

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

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

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

我以为我会把它扔出去看看我忽略了哪些技巧。想法?

感谢。 克雷格

1 个答案:

答案 0 :(得分:0)

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

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