CYLTableViewPlaceHolder - 一行代碼完成“空TableView占位視圖”管理
導航
- 與其他框架的區別
- 集成后的效果
- 使用CYLTableViewPlaceHolder
- 運行Demo
- 適用于多種應用應用場景
- 網絡故障
- 暫無數據 </ol> </li> </ol>
- CYLTableViewPlaceHolder 的
cyl_reloadData
方法內部會重新將該占位視圖的 frame 進行設置,設置為與當前的的TableView
一致:包括 xy 坐標和寬高。防止TableView
位置或尺寸的變更。 -
以上步驟,包括遵循協議實現協議方法,既可以在自定義的
TableView
中去做,也可以在TableView
的代理中去做。既可以讓代理遵循協議,實現協議方法:
@interface ViewController ()<CYLTableViewPlaceHolderDelegate>
也可以讓自定義的
TableView
遵循協議,實現協議方法:@interface MyTableView ()<CYLTableViewPlaceHolderDelegate>
這里推薦在自定義的
TableView
中實現,以降低耦合性,同時也可以為 Controller 瘦身。
與其他框架的區別
- 特點 解釋 </tr> </thead>1 輕量級、無污染 基于 UITableView 分類,無污染,比基于子類化、繼承的框架更加輕量級 </tr>2 低耦合 自定義占位視圖的可自行實現,通過協議傳遞,耦合性極低。 </tr>3 簡單,無學習成本 一行代碼完成,僅需使用 </tr>cyl_reloadData
代替reloadData
即可。自動檢測是否需要addSubview
和removeFromSuperview
,省去學習繁瑣的 add 和 remove 的調用時機。4 使用方法簡單 CYLTableViewPlaceHolder 基于 </tr>dataSource
數據源,所以只需操作dataSource
數據源,即可完成占位視圖的addSubview
和removeFromSuperview
的時機,更加直觀。搭配 MJRefresh 使用十分方便,demo 中也給出了搭配使用方法。5 支持CocoaPods 容易集成 </tr> </tbody> </table>(學習交流群:523070828)
集成后的效果
CYLTableViewPlaceHolder
使用三步完成:
第一步:使用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;
這里注意兩點:
占位視圖的點擊事件等,請自行在
- (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
數據源,即可完成占位視圖的。只要為空就會觸發。并且每次在操作占位視圖的
addSubview和
removeFromSuperview時,每次都會將舊的銷毀,并觸發
- (UIView *)makePlaceHolderView` 創建一個新的視圖。如果在該方法中進行 if 判斷,也就能適用于不同的場景。網絡故障
適用于那些造成 dataSource 為空的原因只能是網絡故障,比如首頁、團購列表、商品列表等
比如
攜程 網絡故障 攜程 網絡故障 攜程 網絡故障 代碼實現時直接返回網絡故障占位視圖,用偽代碼表示則是:
- (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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!相關經驗
sesese色