CYLTableViewPlaceHolder - 一行代碼完成“空TableView占位視圖”管理

jopen 8年前發布 | 32K 次閱讀 iOS開發 移動開發 CYLTableViewPlaceHolder

導航

  1. 與其他框架的區別
  2. 集成后的效果
  3. 使用CYLTableViewPlaceHolder
  4. 運行Demo
  5. 適用于多種應用應用場景

    1. 網絡故障
    2. 暫無數據
    3. </ol> </li> </ol>

      與其他框架的區別

      </tr> </thead>

      </tr>

      </tr>

      </tr>

      </tr>

      </tr> </tbody> </table>

      (學習交流群:523070828)

      集成后的效果

      集成后的效果

      使用CYLTableViewPlaceHolder

      三步完成:

      1. 第一步:使用cocoaPods導入CYLTableViewPlaceHolder
      2. 第二步:遵循協議
      3. 第三步:使用cyl_reloadData代替reloadData

      第一步:使用CocoaPods導入CYLTableViewPlaceHolder

      Podfile 中進行如下導入:

      pod 'CYLTableViewPlaceHolder'

      然后使用 cocoaPods 進行安裝:

      如果尚未安裝 Cocoapods, 運行以下命令進行安裝:

      gem install cocoapods

      安裝成功后就可以安裝依賴了:

      建議使用如下方式:

      # 禁止升級CocoaPods的spec倉庫,否則會卡在 Analyzing dependencies ,非常慢 
       pod update --verbose --no-repo-update

      如果提示找不到庫,則可去掉 --no-repo-update

      pod update

      第二步:遵循協議

      導入頭文件

      #import "CYLTableViewPlaceHolder.h"

      遵循協議

      @interface ViewController ()<CYLTableViewPlaceHolderDelegate>

      實現協議方法:

      僅一個必須實現的協議方法:

      創建一個自定義的占位視圖并返回

      @required
      /*!
       @brief  make an empty overlay view when the tableView is empty
       @return an empty overlay view
       */
      - (UIView *)makePlaceHolderView;

      這里注意兩點:

      1. CYLTableViewPlaceHoldercyl_reloadData方法內部會重新將該占位視圖的 frame 進行設置,設置為與當前的的 TableView 一致:包括 xy 坐標和寬高。防止 TableView 位置或尺寸的變更。
      2. 以上步驟,包括遵循協議實現協議方法,既可以在自定義的 TableView 中去做,也可以在 TableView 的代理中去做。

        既可以讓代理遵循協議,實現協議方法:

        @interface ViewController ()<CYLTableViewPlaceHolderDelegate>

        也可以讓自定義的 TableView 遵循協議,實現協議方法:

        @interface MyTableView ()<CYLTableViewPlaceHolderDelegate>

        這里推薦在自定義的 TableView 中實現,以降低耦合性,同時也可以為 Controller 瘦身。

      占位視圖的點擊事件等,請自行在 - (UIView *)makePlaceHolderView; 中所創建的 View 中實現。

      另外,占位視圖默認的設置是不能滾動的,也就不能下拉刷新了,但是如果想讓占位視圖可以滾動,則需要實現下面的可選代理方法。

      @optional
      /*!
       @brief enable tableView scroll when place holder view is showing,it is disabled by default.
       @attention There is no need to return  NO , it will be NO by default
       @return enable tableView scroll, you can only return YES
       */
      - (BOOL)enableScrollWhenPlaceHolderViewShowing;

      第三步:使用cyl_reloadData代替reloadData

      使用方法:

      僅需使用 cyl_reloadData 代替 reloadData 即可。

      [self.tableView cyl_reloadData];

      注意: cyl_reloadData 內部已經實現了 [self.tableView reloadData]; 方法,請避免重復調用。

      運行Demo

      demo 的刷新組件使用的是 MJRefresh,所以需要導入相應的 CocoaPods 庫

      # 打開終端,進入 clone 的文件夾
      cd /Users/YourUserName/Documents/CYLTableViewPlaceHolder
      # 如果提示找不到庫,則可去掉 --no-repo-update
      pod install --verbose --no-repo-update 
      open CYLTableViewPlaceHolder.xcworkspace

      適用于多種應用應用場景

      CYLTableViewPlaceHolder 是基于 dataSource 數據源是否為空,所以只需操作 dataSource 數據源,即可完成占位視圖的 。只要為空就會觸發。并且每次在操作占位視圖的addSubviewremoveFromSuperview時,每次都會將舊的銷毀,并觸發- (UIView *)makePlaceHolderView` 創建一個新的視圖。如果在該方法中進行 if 判斷,也就能適用于不同的場景。

      1. 網絡故障
        1. 網絡不可用,禁止重新加載
      2. 暫無數據

      網絡故障

      適用于那些造成 dataSource 為空的原因只能是網絡故障,比如首頁、團購列表、商品列表等

      比如

      - 特點 解釋
      1 輕量級、無污染 基于 UITableView 分類,無污染,比基于子類化、繼承的框架更加輕量級
      2 低耦合 自定義占位視圖的可自行實現,通過協議傳遞,耦合性極低。
      3 簡單,無學習成本 一行代碼完成,僅需使用 cyl_reloadData 代替 reloadData 即可。自動檢測是否需要 addSubviewremoveFromSuperview ,省去學習繁瑣的 add 和 remove 的調用時機。
      4 使用方法簡單 CYLTableViewPlaceHolder 基于 dataSource 數據源,所以只需操作 dataSource 數據源,即可完成占位視圖的 addSubviewremoveFromSuperview 的時機,更加直觀。搭配 MJRefresh 使用十分方便,demo 中也給出了搭配使用方法。
      5 支持CocoaPods 容易集成
      攜程 網絡故障 攜程 網絡故障 攜程 網絡故障
      應用場景之加載失敗--攜程 應用場景之加載失敗--攜程 應用場景之加載失敗--攜程

      代碼實現時直接返回網絡故障占位視圖,用偽代碼表示則是:

      - (UIView *)makePlaceHolderView {
              return NetNotAvailableView;
      }

      網絡不可用,禁止重新加載

      如果此時檢測到網絡斷開可以禁止用戶刷新的行為,比如:

      QQ空間 蘇寧易購 嘟嘟美甲
      應用場景之加載失敗 應用場景之加載失敗 應用場景之加載失敗

      暫無數據

      適用于那些造成 dataSource 為空的原因不僅有網絡故障,也可能是確實是服務端也沒有數據,這種場景下需要判斷下當前網絡再返回占位視圖,比如:

      App 暫無數據 網絡故障
      百度傳課 應用場景之暫無數據 應用場景之加載失敗
      暫無數據 暫無數據(美團)
      應用場景之暫無數據 應用場景之暫無數據

      代碼實現,用偽代碼表示則是:

      - (UIView *)makePlaceHolderView {
          if (NetNotAvailable) {
              return NetNotAvailableView;
          } else {
              return NoDataView;
          }
      }

      網絡不可達場景

      - 應用場景之加載失敗 ---
      應用場景之加載失敗 應用場景之加載失敗 應用場景之加載失敗
      應用場景之加載失敗 應用場景之加載失敗 應用場景之加載失敗
      應用場景之加載失敗 應用場景之加載失敗 應用場景之加載失敗
      應用場景之加載失敗 應用場景之加載失敗 應用場景之加載失敗
      應用場景之加載失敗 應用場景之加載失敗 應用場景之加載失敗
      應用場景之加載失敗 應用場景之加載失敗 應用場景之加載失敗
      應用場景之加載失敗 應用場景之加載失敗 應用場景之加載失敗
      應用場景之加載失敗 應用場景之加載失敗 應用場景之加載失敗
      應用場景之加載失敗 應用場景之加載失敗 應用場景之加載失敗
      應用場景之加載失敗 應用場景之加載失敗 應用場景之加載失敗
      應用場景之加載失敗 應用場景之加載失敗 應用場景之加載失敗

      (更多iOS開發干貨,歡迎關注 微博@iOS程序犭袁


      Posted by 微博@iOS程序犭袁
      原創文章,版權聲明:自由轉載-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0



      項目地址: https://github.com/ChenYilong/CYLTableViewPlaceHolder

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!