2013-04-09 70 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

相關問題