大多數(shù)app刷新tableView的時(shí)候, 如果tabview沒有數(shù)據(jù), 則會顯示占位圖片, 這個(gè)怎么做呢? 我想到很多種方案:
- 1.使用
-(void)loadView方法, 根據(jù)是否有數(shù)據(jù)加載不同的視圖 - 2.在基類的TabviewController中監(jiān)聽當(dāng)前控制器存放數(shù)據(jù)的數(shù)組,如果數(shù)組有值則刷新, 如果沒有值則在上面蓋一個(gè)視圖顯示圖片
- 3.hook Tabview的reloadData方法, 根據(jù)dataSource的數(shù)據(jù)來判斷是否顯示圖片
前兩種方法耦合性較高一些, 這里我使用第三種方法演示一遍, 僅給一些人提供一些思路

效果.gif
寫一個(gè)UITableView的分類
@interface UITableView (placeholder)
/* 占位圖 */
@property (nonatomic, strong) UIView *placeHolderView;
@end
#import "UITableView+placeholder.h"
#import <objc/runtime.h>
@implementation NSObject (swizzle)
+ (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);
}
}
@end
@implementation UITableView (placeholder)
+ (void)load
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[self swizzleInstanceSelector:@selector(reloadData) WithSwizzledSelector:@selector(gy_reloadData)];
});
}
- (void)setPlaceHolderView:(UIView *)placeHolderView
{
objc_setAssociatedObject(self, @selector(placeHolderView), placeHolderView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (UIView *)placeHolderView
{
return objc_getAssociatedObject(self, @selector(placeHolderView));
}
- (void)gy_reloadData
{
[self gy_checkEmpty];
[self gy_reloadData];
}
- (void)gy_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) {
[self.placeHolderView removeFromSuperview];
[self addSubview:self.placeHolderView];
}else{
[self.placeHolderView removeFromSuperview];
}
}
則使用如下: 下面的GYNoDataView就是自定義的視圖(在沒有數(shù)據(jù)的時(shí)候顯示)
_tableView.placeHolderView = [[GYNoDataView alloc] initWithFrame:self.view.bounds image:[UIImage imageNamed:@"no_data"] viewClick:^{
NSLog(@"點(diǎn)擊了沒有更多數(shù)據(jù)的圖片");
}];
[_tableView reloadData];