我正在編寫一個自定義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