iOS开发造轮子 | 通用占位图
https://www.jianshu.com/p/beca3ac24031
實際運用場景:
沒網時的提示view,tableView或collectionView沒內容時的展示view,以及其它特殊情況時展示的特定view。如:
常見的幾種情況
我的目標:
對以上幾種情況的展示view做統一封裝,將來做新APP時,我只需在這個輪子上稍加修改就可實現相應需求。
對自己的要求:
代碼簡潔規范,邏輯清晰,保證寫出的代碼將來任何接手的人可以輕松讀懂。
對輪子的要求:
- 使用方便
- 易于維護修改
- 高內聚,低耦合(不要因為這個輪子的加入而影響之前的代碼)
思路:
- 這是一個view,可以添加到tableView或collectionView上的view,當然,也可以添加到其他類型的view上。
- 一般說來,在一個項目中,從UI的角度來看,這樣的view有幾種,但是,從結構的角度來看,它們又一樣,比如說:正中間一個imageView、imageView下方一個label、label下方一個button。
- 點擊這個view或者這個view上的button,會執行相應回調方法。
先貼出代碼,稍后細講
.h文件
.m文件
詳細說明
1.關于構造方法的設計
/**構造方法@param frame 占位圖的frame@param type 占位圖的類型@param delegate 占位圖的代理方 @return 指定frame、類型和代理方的占位圖 */ - (instancetype)initWithFrame:(CGRect)frame type:(CQPlaceholderViewType)type delegate:(id)delegate;三個參數說明:
- frame:決定占位圖的大小和位置。之所以需要這個參數是因為:這個占位圖可能和你的tableView一樣大,也可能是全屏的。
- type:占位圖的類型。這個參數決定占位圖的展示樣式。
- delegate:代理方。處理事件。
2.為什么type和delegate要設置為只讀?
/** 占位圖類型(只讀) */ @property (nonatomic,assign,readonly) CQPlaceholderViewType type; /** 占位圖的代理方(只讀) */ @property (nonatomic,weak,readonly) id <CQPlaceholderViewDelegate> delegate;因為這兩個屬性需要暴露出去,但是我又不希望它們在外部被修改,我希望構造方法是決定這個占位圖屬性的唯一方法。還有就是:讓在外部能直接修改的越少,意外也就越少。
3.為什么我的這代理方法命名如此冗長?
/** 占位圖的重新加載按鈕點擊時回調 */ - (void)placeholderView:(CQPlaceholderView *)placeholderViewreloadButtonDidClick:(UIButton *)sender;可能有人會說,你這個代理方法不就是想要執行重新加載數據方法嘛,直接命名為reloadData不是多好的?反正曾經懵懂的我看別人的代碼時是這樣想當然的認為的,直到有一天我看了官方文檔以及回想了一下系統給代理方法的命名。
其實代理方法的命名是一個非常講究的東西,我之所以這樣命名是完全參照官方文檔的命名規范的,建議有疑問的瞅兩眼delegate 命名。你也可以這樣理解:代理方法,它描述的是某一個事件,而不是事件要執行的某個方法。
4.為什么點擊按鈕后就直接將占位圖移除?
我之前的做法是寫一個移除占位圖的方法,然后將這個方法暴露出去,需要移除的時候就調用這個方法。后面想了想,這樣做完全是自找麻煩:我們點擊UIAlertView的按鈕的時候,這個alertView不就自動移除了嗎?而這個占位圖,不也可以看做是一個彈窗嗎?
?
使用方法
作為標準delegate傳值的view,使用方法類似于系統的UIAlertView。
1. 引入delegate
2. 初始化
CQPlaceholderView *placeholderView = [[CQPlaceholderView alloc]initWithFrame:tableView.bounds type:CQPlaceholderViewTypeNoOrder delegate:self]; [tableView addSubview:placeholderView];看到沒有,我想在哪add就在哪add,比那什么只能在tableView或collectionView上展示的強大多了。正是這個frame和完全開放的被add性決定了這個通用占位圖的高度靈活性。
推了一下我的300多度近視眼鏡
3. 處理回調
對比DZNEmptyDataSet
DZNEmptyDataSet
這是當前很受歡迎的一個庫:
A drop-in UITableView/UICollectionView superclass category for showing empty datasets whenever the view has no content to display
它通過一系列代理方法來決定占位圖的顯示樣式及事件回調。平心而論,很優秀,但是我還是決定用我自己的。
我的看法是(Im my opinion):
DZNEmptyDataSet很強大,它之所以如此強大是為了讓大部分人可以直接拿來即可用,它的目標是滿足大部分開發者的一般常規需求,所以,它或許適合你,但一定不是最適合你,最適合你的,一定是自己親手打造的。還有,它很強大,以至于有些功能你都不需要。
竊以為:知道其實現原理,然后自己封裝真正適合自己當前項目的框架才是王道。
demo
分享的人不少,認真總結分享的人不多,請不要吝惜你的star。
github demo
作者:無夜之星辰
鏈接:https://www.jianshu.com/p/beca3ac24031
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。
轉載于:https://www.cnblogs.com/sundaysgarden/p/9452914.html
總結
以上是生活随笔為你收集整理的iOS开发造轮子 | 通用占位图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python可视化库matplotlib
- 下一篇: 辅助排序和Mapreduce整体流程