UITableView之cell的復用及注意事項
作為iOS最經典的UI控件,熟練掌握UITableView是每個iOS開發者的基本功。本文對UITableView的核心機制——cell的復用加以總結,希望對大家有所幫助。
為了便于敘述,首先將相關方法編號,例如,如果文中提到cm1,指UITableViewCell的initWithStyle:reuseIdentifier:方法(cm表示cell method;tm表示tableView method;dm表示tableView delegate method)。另外,cell的reuseIdentifier(復用標識符)簡寫為ri。
-
UITableViewCell
- cm1: initWithStyle:reuseIdentifier:
- ri: reuseIdentifier
-
UITableView
- tm1: dequeueReusableCellWithIdentifier:
- tm2: registerNib:forCellReuseIdentifier:,或者registerClass:forCellReuseIdentifier:
- tm3: dequeueReusableCellWithIdentifier:forIndexPath:
-
UITableViewDelegate
- dm1: tableView:cellForRowAtIndexPath:
cell的創建和復用
cell的創建和復用過程,根據dm1中使用tm1還是tm3,分為兩種情況:
-
使用tm1:
- tm1根據ri嘗試從復用池中獲取cell,如成功,返回獲取的cell;否則,返回nil;
- 如果tm1返回nil,應該利用cm1主動創建cell,將ri作為參數填入。
-
使用tm3:
- 創建tableView后,使用tm2注冊cell至相應的ri;
- tm3根據ri嘗試從復用池中獲取cell,如成功,返回獲取的cell;否則,系統將自動根據ri創建cell,并返回;即總是有cell成功返回。
Tips:
- tm3需要和tm2配合使用;tm1可以獨立使用;
- tm3自動創建cell;tm1手動創建cell;
- tm3更新,代碼更簡單,推薦使用。
關于復用標識符(ri):
- 一個ri代表一種cell樣式。一般來說,實際開發中,不同樣式的cell就是不同的UITableViewCell子類;
- tableView根據根據ri獲取不同樣式的cell;
cell的prepareForReuse方法
如果需要在cell每次復用之前,對其進行一次reset操作(類似于在飯店每當一桌客人吃完,服務員都會擦桌子,重新擺放餐具,以便迎接下一桌客人)。prepareForReuse是進行這個操作的絕佳點。(注意,這些操作一般都是UI相關的,而非數據)
這個方法會在tm1或tm3返回之前調用,所以,對于cell來說,工作流是這樣的:
dm1中調用tm1--->cell從復用池中被取出--->prepareForReuse(reset UI)--->新數據get---> 展示數據美滋滋??