HomeArrangeVIPCourseView.m 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. //
  2. // HomeArrangeVIPCourseView.m
  3. // KulexiuForStudent
  4. //
  5. // Created by 王智 on 2024/11/18.
  6. //
  7. #import "HomeArrangeVIPCourseView.h"
  8. #import "HomeArrangeSortView.h"
  9. #import "CourseTeacherDescCell.h"
  10. #import "HomeArrangeSortView.h"
  11. #import "HomeArrangeRankView.h"
  12. #import "StateView.h"
  13. #import "Reachability.h"
  14. #import <KSChoosePicker.h>
  15. #import "UserInfoManager.h"
  16. #import "ArrangeTeacherModel.h"
  17. #import "KSBaseWKWebViewController.h"
  18. @interface HomeArrangeVIPCourseView ()<UITableViewDelegate,UITableViewDataSource>
  19. @property (nonatomic, assign) BOOL isLoadMore;
  20. @property (nonatomic, assign) NSInteger rows;
  21. @property (nonatomic, assign) NSInteger pages;
  22. @property (nonatomic, strong) NSMutableArray *dataArray;
  23. @property (nonatomic, strong) StateView *promptView;
  24. @property (nonatomic, strong) UIView *promptPlaceView;
  25. @property (nonatomic, assign) BOOL networkAvaiable; // 网络是否可用
  26. @property (nonatomic, strong) HomeArrangeSortView *searchView;
  27. @property (nonatomic, strong) HomeArrangeRankView *rankView;
  28. @property (nonatomic, strong) NSString *searchKey;
  29. @property (nonatomic, strong) NSString *subjectId;
  30. @property (nonatomic, strong) NSString *sortField;
  31. @property (nonatomic, strong) NSString *sortRole;
  32. @property (nonatomic, assign) BOOL recentFree;
  33. @property (nonatomic, assign) NSInteger subjectIndex;
  34. @end
  35. @implementation HomeArrangeVIPCourseView
  36. - (instancetype)initWithFrame:(CGRect)frame {
  37. self = [super initWithFrame:frame];
  38. if (self) {
  39. self.backgroundColor = [UIColor clearColor];
  40. self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
  41. self.tableView.backgroundColor = [UIColor clearColor];
  42. self.tableView.showsVerticalScrollIndicator = NO;
  43. self.tableView.dataSource = self;
  44. self.tableView.delegate = self;
  45. self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
  46. [self addSubview:self.tableView];
  47. self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
  48. [self.tableView registerNib:[UINib nibWithNibName:@"CourseTeacherDescCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"CourseTeacherDescCell"];
  49. UIView *bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, KPortraitWidth, 10)];
  50. bottomView.backgroundColor = [UIColor clearColor];
  51. self.tableView.tableFooterView = bottomView;
  52. MJWeakSelf;
  53. self.tableView.mj_header = [KSGifRefreshHeader headerWithRefreshingBlock:^{
  54. [weakSelf resetParamenter];
  55. [weakSelf requestData];
  56. }];
  57. self.tableView.mj_footer = [KSGifRefreshFooter footerWithRefreshingBlock:^{
  58. if (weakSelf.isLoadMore) {
  59. weakSelf.pages += 1;
  60. [weakSelf requestData];
  61. }
  62. else {
  63. [weakSelf.tableView.mj_footer endRefreshingWithNoMoreData];
  64. }
  65. }];
  66. [self defaultSubject];
  67. }
  68. return self;
  69. }
  70. - (void)defaultSubject {
  71. self.subjectIndex = 0;
  72. self.subjectId = USER_MANAGER.userInfo.subjectId;
  73. self.searchView.subjectLabel.text = [NSString returnNoNullStringWithString:USER_MANAGER.userInfo.subjectName];
  74. }
  75. - (void)refreshAndRequestData {
  76. [self resetParamenter];
  77. [self requestData];
  78. }
  79. - (void)resetParamenter {
  80. self.isLoadMore = YES;
  81. self.pages = 1;
  82. self.rows = 10;
  83. self.dataArray = [NSMutableArray array];
  84. [self.tableView.mj_footer resetNoMoreData];
  85. [self setPromptString:@"暂无内容" imageName:@"empty_course" inView:self.tableView];
  86. [self.tableView reloadData];
  87. }
  88. - (void)endRefresh {
  89. @weakObj(self);
  90. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  91. @strongObj(self);
  92. [self.tableView.mj_header endRefreshing];
  93. [self.tableView.mj_footer endRefreshing];
  94. });
  95. }
  96. - (void)requestData { // VIP课程
  97. [KSNetworkingManager findTeacherList:KS_POST courseType:@"VIP" subjectId:self.subjectId search:self.searchKey recentFree:self.recentFree sortField:self.sortField sortRule:self.sortRole page:self.pages rows:self.rows success:^(NSDictionary * _Nonnull dic) {
  98. [self endRefresh];
  99. if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
  100. NSArray *sourceArray = [[dic ks_dictionaryValueForKey:@"data"] ks_arrayValueForKey:@"rows"];
  101. for (NSDictionary *parm in sourceArray) {
  102. ArrangeTeacherModel *model = [[ArrangeTeacherModel alloc] initWithDictionary:parm];
  103. [self.dataArray addObject:model];
  104. }
  105. if (sourceArray.count < self.rows) {
  106. self.isLoadMore = NO;
  107. }
  108. }
  109. else {
  110. [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
  111. }
  112. [self.tableView reloadData];
  113. [self changePromptLabelStateWithArray:self.dataArray];
  114. } faliure:^(NSError * _Nonnull error) {
  115. [self endRefresh];
  116. if (self.networkAvaiable == NO) {
  117. [self setPromptString:@"暂无网络" imageName:@"no_networking" inView:self.tableView];
  118. }
  119. [self.dataArray removeAllObjects];
  120. [self.tableView reloadData];
  121. [self changePromptLabelStateWithArray:self.dataArray];
  122. }];
  123. }
  124. - (void)beginRefreshImmediately {
  125. [self.tableView.mj_header beginRefreshing];
  126. }
  127. - (void)beginFirstRefresh {
  128. if (!self.isHeaderRefreshed) {
  129. [self beginRefreshImmediately];
  130. }
  131. }
  132. - (void)selectCellAtIndexPath:(NSIndexPath *)indexPath {
  133. if (self.lastSelectedIndexPath == indexPath) {
  134. return;
  135. }
  136. if (self.lastSelectedIndexPath != nil) {
  137. UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:self.lastSelectedIndexPath];
  138. [cell setSelected:NO animated:NO];
  139. }
  140. UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
  141. [cell setSelected:YES animated:NO];
  142. self.lastSelectedIndexPath = indexPath;
  143. }
  144. - (void)layoutSubviews {
  145. [super layoutSubviews];
  146. CGFloat searchViewHeight = [HomeArrangeSortView getViewHeight];
  147. CGFloat sortHeight = [HomeArrangeRankView getViewHeight];
  148. if (![self.subviews containsObject:self.searchView]) {
  149. [self addSubview:self.searchView];
  150. [self.searchView mas_makeConstraints:^(MASConstraintMaker *make) {
  151. make.left.right.top.mas_equalTo(self);
  152. make.height.mas_equalTo(searchViewHeight);
  153. }];
  154. [self addSubview:self.rankView];
  155. [self.rankView mas_makeConstraints:^(MASConstraintMaker *make) {
  156. make.left.right.mas_equalTo(self);
  157. make.top.mas_equalTo(self.searchView.mas_bottom);
  158. make.height.mas_equalTo(sortHeight);
  159. }];
  160. }
  161. [self.tableView mas_remakeConstraints:^(MASConstraintMaker *make) {
  162. make.left.right.bottom.mas_equalTo(self);
  163. make.top.mas_equalTo(self.rankView.mas_bottom);
  164. }];
  165. }
  166. #pragma mark - UITableViewDataSource
  167. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  168. return self.dataArray.count;
  169. }
  170. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  171. return 106.0f;
  172. }
  173. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  174. CourseTeacherDescCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CourseTeacherDescCell"];
  175. ArrangeTeacherModel *model = [self.dataArray objectAtIndex:indexPath.row];
  176. [cell configWithSource:model];
  177. return cell;
  178. }
  179. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  180. ArrangeTeacherModel *model = self.dataArray[indexPath.row];
  181. KSBaseWKWebViewController *ctrl = [[KSBaseWKWebViewController alloc] init];
  182. ctrl.url = [NSString stringWithFormat:@"%@%@%@&tabs=%@", WEBHOST,@"/#/teacherHome?teacherId=",model.teacherId,@"vip"];;
  183. [self.naviController pushViewController:ctrl animated:YES];
  184. }
  185. #pragma mark ----- lazying
  186. - (HomeArrangeSortView *)searchView {
  187. if (!_searchView) {
  188. _searchView = [HomeArrangeSortView sharedInstance];
  189. MJWeakSelf;
  190. [_searchView searchActionCallback:^(HOME_ARRANGE_SORT type, NSString * _Nullable searchKey) {
  191. [weakSelf courseSortAction:type searchKey:searchKey];
  192. }];
  193. }
  194. return _searchView;
  195. }
  196. - (void)courseSortAction:(HOME_ARRANGE_SORT)type searchKey:(NSString *)searchKey {
  197. switch (type) {
  198. case HOME_ARRANGE_SORT_SUBJECT:
  199. {
  200. [self searchSubject];
  201. }
  202. break;
  203. case HOME_ARRANGE_SORT_SEARCH:
  204. {
  205. [self evaluateSource:searchKey];
  206. }
  207. break;
  208. default:
  209. break;
  210. }
  211. }
  212. - (void)evaluateSource:(NSString *)searchKey {
  213. self.searchKey = searchKey;
  214. [self refreshAndRequestData];
  215. }
  216. - (void)searchSubject {
  217. if (self.subjectList.count) {
  218. NSMutableArray *nameArray = [NSMutableArray array];
  219. for (NSDictionary *parm in self.subjectList) {
  220. [nameArray addObject:[parm ks_stringValueForKey:@"subjectName"]];
  221. }
  222. MJWeakSelf;
  223. KSChoosePicker *picker = [[KSChoosePicker alloc] initWithTitle:@"" sourceData:nameArray lastChooseIndex:self.subjectIndex sureButtonColor:THEMECOLOR chooseReturnWithBlock:^(NSString * _Nonnull returnValue, NSInteger chooseIndex) {
  224. weakSelf.subjectIndex = chooseIndex;
  225. weakSelf.searchView.subjectLabel.text = returnValue;
  226. NSDictionary *parm = self.subjectList[chooseIndex];
  227. weakSelf.subjectId = [parm ks_stringValueForKey:@"subjectId"];
  228. [weakSelf refreshAndRequestData];
  229. } cancel:^{
  230. }];
  231. [picker showPicker];
  232. }
  233. else {
  234. [LOADING_MANAGER MBShowAUTOHidingInWindow:@"无声部信息"];
  235. }
  236. }
  237. - (HomeArrangeRankView *)rankView {
  238. if (!_rankView) {
  239. _rankView = [HomeArrangeRankView sharedInstance];
  240. [_rankView configUI];
  241. MJWeakSelf;
  242. [_rankView sortAction:^(BOOL recentFree, NSString * _Nullable sortField, NSString * _Nullable sortRole) {
  243. weakSelf.recentFree = recentFree;
  244. weakSelf.sortField = sortField;
  245. weakSelf.sortRole = sortRole;
  246. [weakSelf refreshAndRequestData];
  247. }];
  248. }
  249. return _rankView;
  250. }
  251. /**
  252. 设置没有数据时的显示
  253. @param promptString 提示语
  254. @param imgName 图片名称
  255. @param view 显示在什么地方
  256. */
  257. - (void)setPromptString:(NSString *)promptString imageName:(NSString *)imgName inView:(UIView *)view {
  258. if (self.promptView != nil) {
  259. [self.promptView removeFromSuperview];
  260. }
  261. else {
  262. self.promptView = [[StateView alloc]init];
  263. self.promptView.frame = CGRectMake(0, 0, KPortraitWidth, KPortraitHeight - 300);
  264. }
  265. _promptPlaceView = view;
  266. //当请求不到数据时 ,自定义提示view 将会出现;
  267. self.promptView.imageName = imgName;
  268. self.promptView.alpha = 0.0f;
  269. [self.promptView setText:promptString];
  270. [view addSubview:self.promptView];
  271. }
  272. // 结束刷新后调用方法
  273. - (void)changePromptLabelStateWithArray:(NSMutableArray *)array {
  274. NSInteger count;
  275. if (array.count) {
  276. count = array.count;
  277. } else {
  278. count = 0;
  279. }
  280. [UIView animateWithDuration:0.1 animations:^{
  281. [[self promptView] setAlpha:count ? 0.0f :1.0f ] ;
  282. }] ;
  283. }
  284. - (BOOL)networkAvaiable {
  285. return [self checkNetworkAvaiable];
  286. }
  287. - (BOOL)checkNetworkAvaiable {
  288. BOOL isExistenceNetwork = YES;
  289. Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"];
  290. switch ([reach currentReachabilityStatus]) {
  291. case NotReachable:
  292. isExistenceNetwork = NO;
  293. //NSLog(@"notReachable");
  294. break;
  295. case ReachableViaWiFi:
  296. isExistenceNetwork = YES;
  297. //NSLog(@"WIFI");
  298. break;
  299. case ReachableViaWWAN:
  300. isExistenceNetwork = YES;
  301. //NSLog(@"3G");
  302. break;
  303. }
  304. return isExistenceNetwork;
  305. }
  306. /*
  307. // Only override drawRect: if you perform custom drawing.
  308. // An empty implementation adversely affects performance during animation.
  309. - (void)drawRect:(CGRect)rect {
  310. // Drawing code
  311. }
  312. */
  313. @end