1.
如果使用**的方式建立控制項,那麼在
建立時一定會呼叫initwithframe:
方法;如果使用xib/storyboard方式建立控制項,那麼在
建立時一定會呼叫initwithcoder:
方法。
2.在initwithcoder:
裡面訪問屬性,比如self.button
,會發現它是nil的,因為此時自定義控制項
正在初始化
,self.button可能還未賦值(self.button是乙個iboutlet,iboutlet本質上就相當於xcode找到這個對應的屬性,然後uibutton
button = … , [self.view addsubview: button]這種操作,而這一切的操作都是相當於在cylview
view = [[cylview alloc] initwithcoder: nil]方法之後執行的。上面的**就相當於用**的方式實現xcode在storyboard中載入cylview),所以如果在這個方法中進行初始化操作是可能會失敗的。
3.所以建議在awakefromnib
方法中進行初始化的額外操作。
因為awakefromnib
是在
初始化完成後
呼叫,所以在這個方法裡面訪問屬性(iboutlet)就可以保證不為nil。 4.
通過xib的方式建立的自定義控制項,需要設定iboutlet屬性,雖然會呼叫initwithcoder:
方法,但是呼叫這個的方法的時候iboutlet屬性還未設定好,所以在這個方法中訪問屬性將會是nil。而在awakefromnib
中,iboutlet已經初始化完畢,所以在這個方法中初始化不會失敗。
如果通過initwithframe:
方法,說明是通過**建立的自定義控制項,它的屬性並不是iboutlet的,所以不存在未完成iboutlet的屬性未初始化完這種情況。所以在initwithframe:
方法中訪問一些屬性是沒有問題的。但是應該注意,如果是通過init
方法建立的自定義控制項也會呼叫initwithframe:
方法,但是此時的self.frame
是沒有被賦值的(在掉用這個方法的時候並沒有設定控制項的大小),如果這種情況下使用self.frame
是沒有值的。注意這種情況。
ios 載入xib遇到的坑
storyboard,個人覺得是個好玩意兒,但是什麼都做到其中總覺得雜亂。個人偏好把複雜的區域性控制項 比如定製的collectionviewcell 在xib檔案中拉好。在開發過程中遇到不少坑,記憶猶新的是 xib中的部件 比如button 設定圓角的效果不對 載入的xib不能resize大小。v...
ios 載入xib遇到的坑
storyboard,個人覺得是個好玩意兒,但是什麼都做到其中總覺得雜亂。個人偏好把複雜的區域性控制項 比如定製的collectionviewcell 在xib檔案中拉好。在開發過程中遇到不少坑,記憶猶新的是 xib中的部件 比如button 設定圓角的效果不對 載入的xib不能resize大小。v...
iOS 在framework中打包xib
廢話不多說,直接上圖 1 copy bundle resources 中加入相關xib 2 這裡是重點,呼叫的時候不能直接寫 objc view plain copy nsbundlemainbundle loadnibnamed yourxibname owner nil options nil ...