UITableview代理調用順序

最近在自定義tableviewCell的時候,遇到了一些問題,這裏簡單記錄一下。

Situations

首先我自定義TableviewCell, 在cell上設置了一些textfield, 然後在Controller中設置一個textfield實例變量來持有相對應的cell上的輸入框。然後,我想在viewWillAppear中給對應的textfield設置placeholder,然後,我發現,並沒有什麼卵用!!!

然後我仔細查看了一下,發現:在viewWillAppear的時候,self.nameTextfield = nil。說明此時:賦值操作還沒有執行,

然後我就查看了下Tableview代理的調用方法

2017-04-13 16:19:11.520  view will appear
2017-04-13 16:19:11.566  cell for row at index path
2017-04-13 16:19:11.578  cell for row at index path
2017-04-13 16:19:11.580  cell for row at index path
2017-04-13 16:19:11.583  cell for row at index path
2017-04-13 16:19:11.584  viewForHeaderInSection

這裏是tableview有四個cell,所以cellForRowAtIndex方法調用了4次
另外!
viewWillAppear方法是在cell初始化之前的,最後纔是tableviewHeader或者Footer初始化

然後,我以爲這是由於是自定義cell,所以調用順序受到了影響,然後我使用iOS系統的cell,發現:跟上邊自定義的調用順序是一樣的!

Solutions

這裏我說一下我自己的愚見:
1. 我們可以給Controller的textfield使用懶加載,然後不持有cell上輸入框對象,改爲 [cell addSubview: self.controllerTextfield]; 這麼一來,也避免了在複用的時候cellTextfield上文字位置錯亂的問題。
2. 我們可以在viewDidAppear方法中才去相對應的操作

2017-04-13 16:40:30.184  view will appear
2017-04-13 16:40:30.249  cell for row at index path
2017-04-13 16:40:30.266  cell for row at index path
2017-04-13 16:40:30.267  cell for row at index path
2017-04-13 16:40:30.268  cell for row at index path
2017-04-13 16:40:30.269  viewForHeaderInSection
2017-04-13 16:40:30.277  view did appear

由上面的順序可見,viewDiDAppear調用的時候,cell已經初始化了,持有操作已經進行過了,那麼,我們也可以進行相對應的操作了

拋磚引玉,如果大家有別的想法,還請多多指教!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章