2
0

UITableView+CYLTableViewPlaceHolder.m 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. //
  2. // UITableViewController+CYLEmptyReloader.m
  3. // CYLNoResultTableViewController
  4. //
  5. // Created by 微博@iOS程序犭袁 ( http://weibo.com/luohanchenyilong/ ) on 15/12/23.
  6. // Copyright © 2015年 https://github.com/ChenYilong . All rights reserved.
  7. //
  8. #import "UITableView+CYLTableViewPlaceHolder.h"
  9. #import "CYLTableViewPlaceHolderDelegate.h"
  10. #import <objc/runtime.h>
  11. @interface UITableView ()
  12. @property (nonatomic, assign) BOOL scrollWasEnabled;
  13. @property (nonatomic, strong) UIView *placeHolderView;
  14. @end
  15. @implementation UITableView (CYLTableViewPlaceHolder)
  16. - (BOOL)scrollWasEnabled {
  17. // SEL sel = @selector(scrollWasEnabled);
  18. NSNumber *scrollWasEnabledObject = objc_getAssociatedObject(self, _cmd);
  19. return [scrollWasEnabledObject boolValue];
  20. }
  21. - (void)setScrollWasEnabled:(BOOL)scrollWasEnabled {
  22. NSNumber *scrollWasEnabledObject = [NSNumber numberWithBool:scrollWasEnabled];
  23. objc_setAssociatedObject(self, @selector(scrollWasEnabled), scrollWasEnabledObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  24. }
  25. - (UIView *)placeHolderView {
  26. return objc_getAssociatedObject(self, @selector(placeHolderView));
  27. }
  28. - (void)setPlaceHolderView:(UIView *)placeHolderView {
  29. objc_setAssociatedObject(self, @selector(placeHolderView), placeHolderView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  30. }
  31. - (void)cyl_reloadData {
  32. [self reloadData];
  33. [self cyl_checkEmpty];
  34. }
  35. - (void)cyl_checkEmpty {
  36. BOOL isEmpty = YES;
  37. id<UITableViewDataSource> src = self.dataSource;
  38. NSInteger sections = 1;
  39. if ([src respondsToSelector: @selector(numberOfSectionsInTableView:)]) {
  40. sections = [src numberOfSectionsInTableView:self];
  41. }
  42. for (int i = 0; i<sections; ++i) {
  43. NSInteger rows = [src tableView:self numberOfRowsInSection:i];
  44. if (rows) {
  45. isEmpty = NO;
  46. }
  47. }
  48. // isEmpty为空即数据不为空
  49. if (!isEmpty != !self.placeHolderView) {
  50. if (isEmpty) {
  51. self.scrollWasEnabled = self.scrollEnabled;
  52. BOOL scrollEnabled = NO;
  53. if ([self respondsToSelector:@selector(enableScrollWhenPlaceHolderViewShowing)]) {
  54. scrollEnabled = (BOOL)[self performSelector:@selector(enableScrollWhenPlaceHolderViewShowing)];
  55. if (!scrollEnabled) {
  56. NSString *reason = @"There is no need to return NO for `-enableScrollWhenPlaceHolderViewShowing`, it will be NO by default";
  57. @throw [NSException exceptionWithName:NSGenericException
  58. reason:reason
  59. userInfo:nil];
  60. }
  61. } else if ([self.delegate respondsToSelector:@selector(enableScrollWhenPlaceHolderViewShowing)]) {
  62. scrollEnabled = (BOOL)[self.delegate performSelector:@selector(enableScrollWhenPlaceHolderViewShowing)];
  63. if (!scrollEnabled) {
  64. NSString *reason = @"There is no need to return NO for `-enableScrollWhenPlaceHolderViewShowing`, it will be NO by default";
  65. @throw [NSException exceptionWithName:NSGenericException
  66. reason:reason
  67. userInfo:nil];
  68. }
  69. }
  70. self.scrollEnabled = scrollEnabled;
  71. if ([self respondsToSelector:@selector(makePlaceHolderView)]) {
  72. self.placeHolderView = [self performSelector:@selector(makePlaceHolderView)];
  73. } else if ( [self.delegate respondsToSelector:@selector(makePlaceHolderView)]) {
  74. self.placeHolderView = [self.delegate performSelector:@selector(makePlaceHolderView)];
  75. } else {
  76. NSString *selectorName = NSStringFromSelector(_cmd);
  77. NSString *reason = [NSString stringWithFormat:@"You must implement makePlaceHolderView method in your custom tableView or its delegate class if you want to use %@", selectorName];
  78. @throw [NSException exceptionWithName:NSGenericException
  79. reason:reason
  80. userInfo:nil];
  81. }
  82. self.placeHolderView.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
  83. [self addSubview:self.placeHolderView];
  84. } else {
  85. self.scrollEnabled = self.scrollWasEnabled;
  86. [self.placeHolderView removeFromSuperview];
  87. self.placeHolderView = nil;
  88. }
  89. }
  90. else if (isEmpty) {
  91. // Make sure it is still above all siblings.
  92. [self.placeHolderView removeFromSuperview];
  93. [self addSubview:self.placeHolderView];
  94. }
  95. }
  96. @end