大多数app刷新tableView的时候, 如果tabview没有数据, 则会显示占位图片, 这个怎么做呢? 我想到很多种方案:
- 1.使用
-(void)loadView
方法, 根据是否有数据加载不同的视图 - 2.在基类的TabviewController中监听当前控制器存放数据的数组,如果数组有值则刷新, 如果没有值则在上面盖一个视图显示图片
- 3.hook Tabview的reloadData方法, 根据dataSource的数据来判断是否显示图片
前两种方法耦合性较高一些, 这里我使用第三种方法演示一遍, 仅给一些人提供一些思路
写一个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就是自定义的视图(在没有数据的时候显示)
_tableView.placeHolderView = [[GYNoDataView alloc] initWithFrame:self.view.bounds image:[UIImage imageNamed:@"no_data"] viewClick:^{
NSLog(@"点击了没有更多数据的图片");
}];
[_tableView reloadData];