// // XPMonentsRecommendViewController.m // xplan-ios // // Created by 冯硕 on 2022/5/11. // #import "XPMonentsRecommendViewController.h" ///Third #import #import ///Tool #import "ThemeColor.h" #import "XPMacro.h" #import "XPMonentsLayoutConfig.h" #import "TTPopup.h" #import "NSArray+Safe.h" ///Model #import "MonentsInfoModel.h" #import "MonentsTopicModel.h" ///P #import "XPMonentsRecommendPresenter.h" #import "XPMonentsRecommendProtocol.h" ///View #import "XPMonentsTableViewCell.h" #import "XPMonentsEmptyTableViewCell.h" #import "XPMonentsRecommendHeaderView.h" #import "XPMonentsDetailViewController.h" #import "XPMonentTopicContainerViewController.h" #import "XPMoentsTopicListViewController.h" @interface XPMonentsRecommendViewController () ///列表 @property (nonatomic,strong) UITableView *tableView; ///数据源 @property (nonatomic,strong) NSMutableArray *datasource; ///当前的页数 @property (nonatomic,assign) NSInteger page; ///是否有更多的数据 @property (nonatomic,assign) BOOL hasNoMoreData; ///顶部视图 @property (nonatomic,strong) XPMonentsRecommendHeaderView *headerView; @end @implementation XPMonentsRecommendViewController - (BOOL)isHiddenNavBar { return YES; } - (__kindof id)createPresenter { return [[XPMonentsRecommendPresenter alloc] init]; } - (void)viewDidLoad { [super viewDidLoad]; [self initHeaderAndFooterRrfresh]; [self initSubViews]; [self initSubViewConstraints]; } #pragma mark - Private Method - (void)initSubViews { [self.view addSubview:self.tableView]; self.tableView.tableHeaderView = self.headerView; } - (void)initSubViewConstraints { [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.view); }]; } #pragma mark - 下拉刷新 - (void)initHeaderAndFooterRrfresh { MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(headerRefresh)]; header.stateLabel.font = [UIFont systemFontOfSize:10.0]; header.lastUpdatedTimeLabel.font = [UIFont systemFontOfSize:10.0]; header.stateLabel.textColor = [ThemeColor secondTextColor]; header.lastUpdatedTimeLabel.textColor = [ThemeColor secondTextColor]; self.tableView.mj_header = header; MJRefreshBackNormalFooter *footer = [MJRefreshBackNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(footerRefresh)]; footer.stateLabel.textColor = [ThemeColor secondTextColor]; footer.stateLabel.font = [UIFont systemFontOfSize:10.0]; self.tableView.mj_footer = footer; [self headerRefresh]; } #pragma mark - 刷新的fangfa - (void)headerRefresh { self.page = 1; [self.presenter getMonentsRecommendList:self.page pageSize:20 state:0]; [self.presenter getMonentsTopicList:self.page pageSize:20]; } - (void)footerRefresh { if (self.hasNoMoreData) { [self showErrorToast:@"没有更多数据了"]; [self.tableView.mj_footer endRefreshing]; return; } self.page++; [self.presenter getMonentsRecommendList:self.page pageSize:20 state:1]; } #pragma mark - UITableViewDelegate And UITableViewDataSource - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.datasource.count > 0 ? self.datasource.count : 1; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if (self.datasource.count > 0) { MonentsInfoModel * monentInfo= [self.datasource safeObjectAtIndex1:indexPath.row]; [XPMonentsLayoutConfig layoutMonentsModel:monentInfo]; return monentInfo.rowHeight; } return KScreenHeight - kNavigationHeight - 49 - kSafeAreaBottomHeight; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (self.datasource.count > 0) { XPMonentsTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMonentsTableViewCell class])]; MonentsInfoModel * monentsInfo = [self.datasource safeObjectAtIndex1:indexPath.row]; cell.monentsInfo = monentsInfo; cell.delegate = self; return cell; } XPMonentsEmptyTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMonentsEmptyTableViewCell class])]; return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; if (self.datasource.count > 0) { XPMonentsDetailViewController * detailVC = [[XPMonentsDetailViewController alloc] init]; MonentsInfoModel * monentsInfo = [self.datasource safeObjectAtIndex1:indexPath.row]; detailVC.monentsInfo = monentsInfo; detailVC.delegate = self; [self.navigationController pushViewController:detailVC animated:YES]; } } #pragma mark - XPMonentsDetailViewControllerDelegate - (void)xPMonentsDetailViewController:(XPMonentsDetailViewController *)view deleteMonents:(NSString *)dynamicId { __block MonentsInfoModel * deleteInfo; [self.datasource enumerateObjectsUsingBlock:^(MonentsInfoModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if (obj.dynamicId.integerValue == dynamicId.integerValue) { deleteInfo = obj; } }]; if (deleteInfo) { [self.datasource removeObject:deleteInfo]; [self.tableView reloadData]; } } #pragma mark - XPMonentsTableViewCellDelegate - (void)xPMonentsTableViewCell:(XPMonentsTableViewCell *)view didClickLike:(MonentsInfoModel *)monentsInfo { [self.presenter likeMonent:monentsInfo.dynamicId status:!monentsInfo.isLike likedUid:monentsInfo.uid worldId:[NSString stringWithFormat:@"%ld", monentsInfo.worldId]]; } - (void)xPMonentsTableViewCell:(XPMonentsTableViewCell *)view didClicDelete:(MonentsInfoModel *)monentsInfo { [TTPopup alertWithMessage:@"删除后不可恢复\n确定删除该动态吗?" confirmHandler:^{ [self.presenter deleteMonents:monentsInfo.dynamicId worldId:[NSString stringWithFormat:@"%ld", monentsInfo.worldId]]; } cancelHandler:^{ }]; } - (void)xPMonentsTableViewCell:(XPMonentsTableViewCell *)view didClicFold:(MonentsInfoModel *)monentsInfo { __block MonentsInfoModel * monentsInfos; [self.datasource enumerateObjectsUsingBlock:^(MonentsInfoModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if (obj.dynamicId.integerValue == monentsInfo.dynamicId.integerValue) { monentsInfos = obj; *stop = YES; } }]; if (monentsInfos) { NSInteger row = [self.datasource indexOfObject:monentsInfo]; [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:row inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; } } #pragma mark - XPMonentsRecommendHeaderViewDelegate - (void)xPMonentsRecommendHeaderView:(XPMonentsRecommendHeaderView *)view didSelectItem:(MonentsTopicModel *)info { XPMonentTopicContainerViewController * topicVC = [[XPMonentTopicContainerViewController alloc] init]; topicVC.worldId = info.tId; [self.navigationController pushViewController:topicVC animated:YES]; } - (void)xPMonentsRecommendHeaderView:(XPMonentsRecommendHeaderView *)view didClickMoreTopic:(UIButton *)sender { XPMoentsTopicListViewController * topicListVC = [[XPMoentsTopicListViewController alloc] init]; [self.navigationController pushViewController:topicListVC animated:YES]; } #pragma mark -JXCategoryListContainerViewDelegate - (UIView *)listView { return self.view; } #pragma mark - XPMonentsRecommendProtocol - (void)getMonentsRecommendListSuccess:(NSArray *)array state:(int)state { if (state == 0) { [self.datasource removeAllObjects]; } if (array.count > 0) { [self.datasource addObjectsFromArray:array]; } if (state == 0) { self.hasNoMoreData = NO; [self.tableView.mj_header endRefreshing]; } else { if (array.count > 0) { self.hasNoMoreData = NO; } else { self.hasNoMoreData = YES; } [self.tableView.mj_footer endRefreshing]; } [self.tableView reloadData]; } - (void)getMonentsRecommendListFail:(NSString *)msg state:(int)state { if (state == 0) { [self.tableView.mj_header endRefreshing]; } else { [self.tableView.mj_footer endRefreshing]; } } - (void)monentsTopicListSuccess:(NSArray *)array { self.headerView.topicList = array; } - (void)likeMonentsSuccess:(NSString *)dynamicId status:(BOOL)status { [self.datasource enumerateObjectsUsingBlock:^(MonentsInfoModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if ([obj.dynamicId isEqualToString:dynamicId]) { if (status) { obj.isLike += 1; } else { obj.isLike -= 1; } *stop = YES; } }]; [self.tableView reloadData]; } - (void)deleteMonentsSuccess:(NSString *)monentsInfo { [self showSuccessToast:@"删除成功"]; __block MonentsInfoModel * deleteInfo; [self.datasource enumerateObjectsUsingBlock:^(MonentsInfoModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if (obj.dynamicId.integerValue == monentsInfo.integerValue) { deleteInfo = obj; } }]; if (deleteInfo) { [self.datasource removeObject:deleteInfo]; [self.tableView reloadData]; } } #pragma mark - Getters And Setters - (UITableView *)tableView { if (!_tableView) { _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]; _tableView.delegate = self; _tableView.dataSource = self; _tableView.tableFooterView = [UIView new]; _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; _tableView.backgroundColor = [UIColor clearColor]; if (@available(iOS 11.0, *)) { _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } [_tableView registerClass:[XPMonentsTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPMonentsTableViewCell class])]; [_tableView registerClass:[XPMonentsEmptyTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPMonentsEmptyTableViewCell class])]; } return _tableView; } - (NSMutableArray *)datasource { if (!_datasource) { _datasource = [NSMutableArray array]; } return _datasource; } - (XPMonentsRecommendHeaderView *)headerView { if (!_headerView) { _headerView = [[XPMonentsRecommendHeaderView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, 80)]; _headerView.delegate = self; } return _headerView; } @end