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