YMDynamicListViewController.m 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. //
  2. // YMDynamicListViewController.m
  3. // MSYOUPAI
  4. //
  5. // Created by YoMi on 2024/2/26.
  6. // Copyright © 2024 MS. All rights reserved.
  7. //
  8. #import "YMDynamicListViewController.h"
  9. #import "YMDynamicListViewModel.h"
  10. #import "YMChatNotificationViewModel.h"
  11. #import "YMDynamicListCell.h"
  12. @interface YMDynamicListViewController ()<UITableViewDataSource, UITableViewDelegate>
  13. /// 滚动视图回调
  14. @property (nonatomic, copy) void(^scrollCallback)(UIScrollView *scrollView);
  15. /// 列表VM
  16. @property (nonatomic, strong) YMDynamicListViewModel *viewModel;
  17. /// 容器列表
  18. @property (nonatomic, strong) UITableView *contentTableView;
  19. @end
  20. @implementation YMDynamicListViewController
  21. @dynamic viewModel;
  22. - (void)viewDidLoad {
  23. [super viewDidLoad];
  24. [self setNavHidden:YES];
  25. YMEmptyView *empty = [YMEmptyView emptyActionViewWithImage:ImageByName(@"ym_common_no_data_icon") titleStr:@"开启“个性化推荐”后可启用动态列表" detailStr:@"" btnTitleStr:@"立即开启" btnClickBlock:^{
  26. YMChatNotificationViewModel *chatNotificationVM = [[YMChatNotificationViewModel alloc]initWithParams:@{}];
  27. [YMRouter openURL:stringFormat(@"%@%@", YM_ROUTER_URL_PREFIX, YM_ROUTER_CHAT_NOTIFICATION) withUserInfo:@{
  28. RouterViewModel:chatNotificationVM
  29. } completion:nil];
  30. }];
  31. empty.contentViewOffset = adapt(-80);
  32. empty.imageSize = kEmptyViewSize;
  33. empty.titleLabFont = LCFont(13);
  34. empty.titleLabTextColor = HexColorFromRGB(0x9b9b9b);
  35. empty.actionBtnCornerRadius = adapt(10);
  36. empty.actionBtnTitleColor = HexColorFromRGB(0xFFFFFF);
  37. empty.actionBtnBackGroundColor = HexColorFromRGB(0xfd7bc5);
  38. self.view.ym_emptyView = empty;
  39. self.view.ym_emptyView.autoShowEmptyView = NO;
  40. }
  41. - (void)viewWillAppear:(BOOL)animated{
  42. [super viewWillAppear:animated];
  43. [self dynamicIsHidePersonalizedRecommendationTips];
  44. }
  45. - (void)ym_setupViews {
  46. [self.view addSubview:self.contentTableView];
  47. [self.view setNeedsUpdateConstraints];
  48. [self.view updateConstraintsIfNeeded];
  49. }
  50. - (void)updateViewConstraints {
  51. [self.contentTableView mas_makeConstraints:^(MASConstraintMaker *make) {
  52. make.top.equalTo(self.view);
  53. make.left.equalTo(self.view);
  54. make.right.equalTo(self.view);
  55. make.bottom.equalTo(self.view).offset(-TabbarHeight);
  56. }];
  57. [super updateViewConstraints];
  58. }
  59. - (void)ym_bindViewModel {
  60. [self headerRefreshing];
  61. @weakify(self)
  62. [[self.viewModel.refreshUISubject takeUntil:self.rac_willDeallocSignal] subscribeNext:^(id result) {
  63. @strongify(self)
  64. [self.contentTableView reloadData];
  65. switch ([result intValue]) {
  66. case YMHeaderRefresh_HasMoreData:
  67. case YMHeaderRefresh_HasNoMoreData:
  68. {
  69. [self.contentTableView.mj_header endRefreshing];
  70. [self.contentTableView.mj_footer endRefreshing];
  71. }
  72. break;
  73. case YMFooterRefresh_HasMoreData:
  74. {
  75. [self.contentTableView.mj_header endRefreshing];
  76. [self.contentTableView.mj_footer endRefreshing];
  77. if (self.contentTableView.mj_footer == self.noLoadMoreFooter) {
  78. self.contentTableView.mj_footer = self.loadMoreFooter;
  79. }
  80. }
  81. break;
  82. case YMFooterRefresh_HasNoMoreData:
  83. {
  84. [self.contentTableView.mj_header endRefreshing];
  85. [self.contentTableView.mj_footer endRefreshing];
  86. if (self.contentTableView.mj_footer == self.loadMoreFooter) {
  87. self.contentTableView.mj_footer = self.noLoadMoreFooter;
  88. }
  89. }
  90. break;
  91. case YMRefreshError: {
  92. [self.contentTableView.mj_header endRefreshing];
  93. [self.contentTableView.mj_footer endRefreshing];
  94. }
  95. break;
  96. default:
  97. break;
  98. }
  99. [self.contentTableView ym_endLoading];
  100. }];
  101. }
  102. #pragma mark - UITableViewDataSource
  103. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
  104. return 1;
  105. }
  106. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  107. return self.viewModel.listDataArray.count;
  108. }
  109. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  110. YMDynamicListCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([YMDynamicListCell class])];
  111. if (!cell) {
  112. cell = [[YMDynamicListCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:NSStringFromClass([YMDynamicListCell class])];
  113. }
  114. cell.selectionStyle = UITableViewCellSelectionStyleNone;
  115. [cell ym_bindViewModel:self.viewModel.listDataArray[indexPath.item]];
  116. return cell;
  117. }
  118. #pragma mark - UITableViewDelegate
  119. - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
  120. return nil;
  121. }
  122. - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
  123. return CGFLOAT_MIN;
  124. }
  125. - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
  126. return nil;
  127. }
  128. - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
  129. return CGFLOAT_MIN;
  130. }
  131. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  132. if (self.viewModel.listDataArray[indexPath.item].dynamicId != 0) {
  133. [self.viewModel.gotoDynamicDetailSubject sendNext:@(self.viewModel.listDataArray[indexPath.item].dynamicId)];
  134. }
  135. }
  136. ///动态是否隐藏个性化推荐提示
  137. - (void)dynamicIsHidePersonalizedRecommendationTips{
  138. if ([[OCUserDefaults objectForKey:kIS_HIDE_PERSONALIZED_RECOMMENDATION_TIPS] boolValue]) {
  139. self.contentTableView.hidden = NO;
  140. [self.view ym_hideEmptyView];
  141. } else {
  142. self.contentTableView.hidden = YES;
  143. [self.view ym_showEmptyView];
  144. }
  145. }
  146. - (void)headerRefreshing{
  147. [self.contentTableView ym_startLoading];
  148. self.viewModel.currentPage = 1;
  149. [self.viewModel getDynamicListData];
  150. }
  151. - (void)footerRefreshing{
  152. [self.contentTableView ym_startLoading];
  153. self.viewModel.currentPage++;
  154. [self.viewModel getDynamicListData];
  155. }
  156. - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
  157. !self.scrollCallback ?: self.scrollCallback(scrollView);
  158. }
  159. #pragma mark - JXPagingViewListViewDelegate
  160. - (UIView *)listView {
  161. return self.view;
  162. }
  163. - (UIScrollView *)listScrollView {
  164. return self.contentTableView;
  165. }
  166. - (void)listViewDidScrollCallback:(void (^)(UIScrollView *))callback {
  167. self.scrollCallback = callback;
  168. }
  169. - (void)listWillAppear {
  170. // NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd));
  171. }
  172. - (void)listDidAppear {
  173. // NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd));
  174. }
  175. - (void)listWillDisappear {
  176. // NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd));
  177. }
  178. - (void)listDidDisappear {
  179. // NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd));
  180. }
  181. - (UITableView *)contentTableView{
  182. if (!_contentTableView) {
  183. _contentTableView = [[UITableView alloc]initWithFrame:CGRectZero style:UITableViewStylePlain];
  184. _contentTableView.delegate = self;
  185. _contentTableView.dataSource = self;
  186. _contentTableView.rowHeight = UITableViewAutomaticDimension;
  187. _contentTableView.estimatedRowHeight = adapt(44);
  188. _contentTableView.showsVerticalScrollIndicator = NO;
  189. _contentTableView.showsHorizontalScrollIndicator = NO;
  190. _contentTableView.separatorColor = UIColor.clearColor;
  191. _contentTableView.backgroundColor = HexColorFromRGB(0xF6F6F6);
  192. [_contentTableView registerClass:[YMDynamicListCell class] forCellReuseIdentifier:NSStringFromClass([YMDynamicListCell class])];
  193. _contentTableView.mj_header = self.refreshHeader;
  194. _contentTableView.mj_footer = self.noLoadMoreFooter;
  195. YMEmptyView *empty = [YMEmptyView emptyViewWithImageStr:@"ym_common_no_data_icon" titleStr:@"暂无数据" detailStr:@""];
  196. empty.imageSize = kEmptyViewSize;
  197. _contentTableView.ym_emptyView = empty;
  198. _contentTableView.ym_emptyView.autoShowEmptyView = NO;
  199. }
  200. return _contentTableView;
  201. }
  202. @end