在使用 UITableView
時,必須實現的協議主要包括以下幾個
1. UITableViewDataSource
協議
這是最重要的協議,用於提供資料給 UITableView
。沒有這個協議,UITableView
是無法顯示任何內容的。
必須實現的方法:
-
tableView:numberOfRowsInSection:
:返回給定 section 中的行數。- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
-
tableView:cellForRowAtIndexPath:
:返回對應indexPath
的單元格(UITableViewCell
)。- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
這兩個方法是 UITableViewDataSource
協議中最核心的必須實現的方法。
可選的方法:
-
tableView:titleForHeaderInSection:
:返回指定 section 的標題(用於表頭)。- (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
-
tableView:titleForFooterInSection:
:返回指定 section 的標題(用於表尾)。- (nullable NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
-
tableView:canEditRowAtIndexPath:
:指示是否允許編輯某一行。- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;
-
tableView:canMoveRowAtIndexPath:
:指示是否允許移動某一行。- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;
2. UITableViewDelegate
協議
UITableViewDelegate
協議用於處理表檢視的互動,例如行選擇、行刪除、行移動等。這個協議的實現通常是為了增強使用者體驗。
必須實現的方法:
實際上,UITableViewDelegate
中並沒有嚴格“必須”實現的方法,但是通常會實現以下幾種常見方法:
-
tableView:didSelectRowAtIndexPath:
:當使用者點選某一行時呼叫。- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
可選的方法:
-
tableView:heightForRowAtIndexPath:
:設定行高。- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
-
tableView:heightForHeaderInSection:
:設定表頭的高度。- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
-
tableView:heightForFooterInSection:
:設定表尾的高度。- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
-
tableView:viewForHeaderInSection:
:自定義表頭檢視。- (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
-
tableView:viewForFooterInSection:
:自定義表尾檢視。- (nullable UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;
-
tableView:didDeselectRowAtIndexPath:
:當使用者取消選擇某一行時呼叫。- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath;
3. UITableViewDragDelegate
和 UITableViewDropDelegate
(iOS 11 及以上)
這些協議主要用於拖放操作(drag and drop
)功能,適用於需要支援拖動排序或拖拽新增資料的表格。
UITableViewDragDelegate
:用於處理行拖拽操作。UITableViewDropDelegate
:用於處理行的接收(drop)操作。
這些協議方法在使用拖放功能時非常有用,但它們是可選的,只在支援拖放操作時才需要實現。
4. UITableViewDataSourcePrefetching
(iOS 10 及以上)
如果表格需要進行資料預載入,UITableViewDataSourcePrefetching
協議非常有用。這個協議允許提前載入即將顯示的行的資料(例如,提前載入圖片或遠端資料)。
-
tableView:prefetchRowsAtIndexPaths:
:預載入資料的方法。- (void)tableView:(UITableView *)tableView prefetchRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;
-
tableView:cancelPrefetchingForRowsAtIndexPaths:
:取消預載入的資料的方法。- (void)tableView:(UITableView *)tableView cancelPrefetchingForRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;
總結
-
必需的協議:
UITableViewDataSource
:主要負責提供資料。UITableViewDelegate
:主要負責處理互動(例如行的選擇、編輯、行高等)。
-
可選的協議:
UITableViewDragDelegate
和UITableViewDropDelegate
(用於拖放操作)。UITableViewDataSourcePrefetching
(用於資料預載入)。
大部分時候,只需要實現 UITableViewDataSource
和 UITableViewDelegate
中的幾個關鍵方法。如果還需要自定義其他功能(例如拖放、資料預載入),可以根據需求再實現其他協議的方法。
而使用UIcollectionView
也是相同的。