iOS造轮子系列-TableView空数据显示占位图片 runtime实现

大多数app刷新tableView的时候, 如果tabview没有数据, 则会显示占位图片, 这个怎么做呢? 我想到很多种方案:

  • 1.使用-(void)loadView方法, 根据是否有数据加载不同的视图
  • 2.在基类的TabviewController中监听当前控制器存放数据的数组,如果数组有值则刷新, 如果没有值则在上面盖一个视图显示图片
  • 3.hook Tabview的reloadData方法, 根据dataSource的数据来判断是否显示图片
    前两种方法耦合性较高一些, 这里我使用第三种方法演示一遍, 仅给一些人提供一些思路
iOS造轮子系列-TableView空数据显示占位图片 runtime实现_第1张图片
效果.gif

写一个UITableView的分类

@interface UITableView (placeholder)

/* 占位图 */
@property (nonatomic, strong) UIView *placeHolderView;
@end
#import "UITableView+placeholder.h"
#import 

@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 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];

你可能感兴趣的:(iOS造轮子系列-TableView空数据显示占位图片 runtime实现)