iOS開發- tableView的協議

机械心發表於2024-11-13

在使用 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. UITableViewDragDelegateUITableViewDropDelegate(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:主要負責處理互動(例如行的選擇、編輯、行高等)。
  • 可選的協議

    • UITableViewDragDelegateUITableViewDropDelegate(用於拖放操作)。
    • UITableViewDataSourcePrefetching(用於資料預載入)。

大部分時候,只需要實現 UITableViewDataSourceUITableViewDelegate 中的幾個關鍵方法。如果還需要自定義其他功能(例如拖放、資料預載入),可以根據需求再實現其他協議的方法。

而使用UIcollectionView也是相同的。

相關文章