ios UITableView實(shí)現(xiàn)無(wú)數(shù)據(jù)加載占位圖片
本文介紹了ios UITableView實(shí)現(xiàn)無(wú)數(shù)據(jù)占位圖片,分享給大家,具體如下:
國(guó)際慣例,上效果圖
該效果的實(shí)現(xiàn)主要是使用runtime的交叉方法實(shí)現(xiàn),將tableView的reloadData與自定義的kk_reloadData交換。新建tableView的Category。
交換方法主要代碼
+ (void)swizzleInstanceSelector:(SEL)originalSel WithSwizzledSelector:(SEL)swizzledSel { Method originMethod = class_getInstanceMethod(self, originalSel); Method swizzedMehtod = class_getInstanceMethod(self, swizzledSel); BOOL methodAdded = class_addMethod(self, originalSel, method_getImplementation(swizzedMehtod), method_getTypeEncoding(swizzedMehtod)); if (methodAdded) { class_replaceMethod(self, swizzledSel, method_getImplementation(originMethod), method_getTypeEncoding(originMethod)); }else{ method_exchangeImplementations(originMethod, swizzedMehtod); } }
交換reloadData
+ (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ [self swizzleInstanceSelector:@selector(reloadData) WithSwizzledSelector:@selector(kk_reloadData)]; }); }
kk_reloadData方法,先檢查是否有數(shù)據(jù),再次kk_reloadData方法此時(shí)已使用runtime的交換方法則則實(shí)際上調(diào)用的是系統(tǒng)的reloadData方法。
- (void)kk_reloadData { [self kk_checkEmpty]; [self kk_reloadData]; }
kk_checkEmpty方法
- (void)kk_checkEmpty { BOOL isEmpty = YES; id<UITableViewDataSource> src = self.dataSource; NSInteger sections = 1; if ([src respondsToSelector:@selector(numberOfSectionsInTableView:)]) { sections = [src numberOfSectionsInTableView:self]; } for (int i = 0; i < sections; i++) { NSInteger rows = [src tableView:self numberOfRowsInSection:i]; if (rows) { isEmpty = NO; } } if (isEmpty) {//數(shù)據(jù)為空,在這里添加視圖 }else{//數(shù)據(jù)不為空,在這里一處視圖 } }
為了降低代碼的侵入,可以給tableView動(dòng)態(tài)添加一個(gè)View屬性即是占位圖視圖。
@property (nonatomic, strong) UIView *placeHolderView;
- (void)setPlaceHolderView:(UIView *)placeHolderView { objc_setAssociatedObject(self, @selector(placeHolderView), placeHolderView, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (UIView *)placeHolderView { return objc_getAssociatedObject(self, @selector(placeHolderView)); }
kk_checkEmpty的
if (isEmpty) {//數(shù)據(jù)為空,在這里添加視圖 }else{//數(shù)據(jù)不為空,在這里一處視圖 }
修改為
if (isEmpty) { [self.placeHolderView removeFromSuperview]; [self addSubview:self.placeHolderView]; }else{ [self.placeHolderView removeFromSuperview]; }
以后使用的時(shí)候只需設(shè)置tableView的placeHolderView屬性即可
_tableView.placeHolderView = [[UIView alloc] init];
打完收工
github地址: https://github.com/wuzaozhou/UITableView-placeholder
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
OC - 9.基于Quartz2D繪制下載進(jìn)度條(demo)
這篇文章主要介紹了OC - 9.基于Quartz2D繪制下載進(jìn)度條(demo)的相關(guān)資料,需要的朋友可以參考下2015-11-11解決ios手機(jī)中input輸入框光標(biāo)過(guò)長(zhǎng)的問(wèn)題
在項(xiàng)目中做移動(dòng)端頁(yè)面,發(fā)現(xiàn)IOS 的光標(biāo)大小很大,和安卓的完全不一樣,怎么來(lái)調(diào)整大小呢?下面小編給大家?guī)?lái)了ios手機(jī)中input輸入框光標(biāo)過(guò)長(zhǎng)問(wèn)題的解決方法,一起看看吧2018-08-08IOS NSNotification 鍵盤遮擋問(wèn)題的解決辦法
這篇文章主要介紹了IOS NSNotification 鍵盤遮擋問(wèn)題的解決辦法的相關(guān)資料,希望通過(guò)本文能幫助到大家,解決這樣的問(wèn)題,需要的朋友可以參考下2017-09-09關(guān)于iOS 11的一些新特性適配實(shí)踐總結(jié)
iOS 11 為整個(gè)生態(tài)系統(tǒng)的 UI 元素帶來(lái)了一種更加大膽、動(dòng)態(tài)的新風(fēng)格。下面這篇文章主要給大家總結(jié)介紹了關(guān)于iOS 11的一些新特性適配實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-11-11總結(jié)適配IOS10開(kāi)發(fā)需要注意的問(wèn)題
本篇文章主要介紹了適配IOS10需要注意的問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。2016-12-12iOS開(kāi)發(fā)教程之扇形動(dòng)畫的實(shí)現(xiàn)
實(shí)現(xiàn)扇形圖大家應(yīng)該都會(huì)的,但是扇形動(dòng)畫大家都會(huì)實(shí)現(xiàn)嗎?下面這篇文章主要給大家介紹了關(guān)于iOS開(kāi)發(fā)教程之扇形動(dòng)畫實(shí)現(xiàn)的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-06-06