iOS中從載入的xib中得到的控制項為空的問題

2021-07-16 22:07:21 字數 1216 閱讀 2028

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 ...