// // EPMomentViewController.m // YuMi // // Created by AI on 2025-10-09. // Copyright © 2025 YuMi. All rights reserved. // #import "EPMomentViewController.h" #import "NewMomentCell.h" #import #import "Api+Moments.h" #import "AccountInfoStorage.h" #import "MomentsInfoModel.h" #import @interface NewMomentViewController () // MARK: - UI Components /// 主列表(卡片式布局) @property (nonatomic, strong) UITableView *tableView; /// 刷新控件 @property (nonatomic, strong) UIRefreshControl *refreshControl; /// 发布按钮 @property (nonatomic, strong) UIButton *publishButton; // MARK: - Data /// 动态数据源(MomentsInfoModel 数组) @property (nonatomic, strong) NSMutableArray *dataSource; /// 当前页码 @property (nonatomic, assign) NSInteger currentPage; /// 是否正在加载 @property (nonatomic, assign) BOOL isLoading; @end @implementation EPMomentViewController // MARK: - Lifecycle - (void)viewDidLoad { [super viewDidLoad]; self.title = @"动态"; self.view.backgroundColor = [UIColor colorWithRed:0.96 green:0.96 blue:0.96 alpha:1.0]; // 浅灰背景 [self setupUI]; [self loadData]; NSLog(@"[EPMomentViewController] 页面加载完成"); } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // 隐藏导航栏(如果需要沉浸式体验) // [self.navigationController setNavigationBarHidden:YES animated:animated]; } // MARK: - Setup UI - (void)setupUI { // TableView [self.view addSubview:self.tableView]; [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.view); }]; // 发布按钮(悬浮在右下角) [self.view addSubview:self.publishButton]; [self.publishButton mas_makeConstraints:^(MASConstraintMaker *make) { make.right.equalTo(self.view).offset(-20); make.bottom.equalTo(self.view).offset(-100); // 避开 TabBar make.size.mas_equalTo(CGSizeMake(56, 56)); }]; NSLog(@"[NewMomentViewController] UI 设置完成"); } // MARK: - Data Loading - (void)loadData { if (self.isLoading) return; self.isLoading = YES; NSLog(@"[NewMomentViewController] 开始加载数据,页码: %ld", (long)self.currentPage); // 调用真实 API 加载动态列表 NSString *page = [NSString stringWithFormat:@"%ld", (long)self.currentPage]; NSString *pageSize = @"10"; NSString *types = @"0,2"; // 类型:0=图片,2=文字 [Api momentsRecommendList:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { self.isLoading = NO; [self.refreshControl endRefreshing]; if (code == 200 && data.data) { // 解析数据 NSArray *list = [MomentsInfoModel mj_objectArrayWithKeyValuesArray:data.data]; if (list.count > 0) { [self.dataSource addObjectsFromArray:list]; self.currentPage++; [self.tableView reloadData]; NSLog(@"[NewMomentViewController] 加载成功,新增 %lu 条动态", (unsigned long)list.count); } else { NSLog(@"[NewMomentViewController] 没有更多数据"); } } else { NSLog(@"[NewMomentViewController] 加载失败: code=%ld, msg=%@", (long)code, msg); // 如果 API 失败,显示提示 if (self.dataSource.count == 0) { // 首次加载失败,显示空状态 [self showAlertWithMessage:msg ?: @"加载失败"]; } } } page:page pageSize:pageSize types:types]; } - (void)onRefresh { self.currentPage = 0; [self.dataSource removeAllObjects]; [self loadData]; } // MARK: - Actions - (void)onPublishButtonTapped { NSLog(@"[NewMomentViewController] 发布按钮点击"); // TODO: 跳转到发布页面 [self showAlertWithMessage:@"发布功能开发中"]; } - (void)showAlertWithMessage:(NSString *)message { UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:message preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]]; [self presentViewController:alert animated:YES completion:nil]; } // MARK: - UITableViewDataSource - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.dataSource.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NewMomentCell *cell = [tableView dequeueReusableCellWithIdentifier:@"NewMomentCell" forIndexPath:indexPath]; if (indexPath.row < self.dataSource.count) { MomentsInfoModel *model = self.dataSource[indexPath.row]; [cell configureWithModel:model]; } return cell; } // MARK: - UITableViewDelegate - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; NSLog(@"[NewMomentViewController] 点击动态: %ld", (long)indexPath.row); // TODO: 跳转到详情页 [self showAlertWithMessage:[NSString stringWithFormat:@"点击了第 %ld 条动态", (long)indexPath.row]]; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewAutomaticDimension; } - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { return 200; } // 滚动到底部时加载更多 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat offsetY = scrollView.contentOffset.y; CGFloat contentHeight = scrollView.contentSize.height; CGFloat screenHeight = scrollView.frame.size.height; if (offsetY > contentHeight - screenHeight - 100 && !self.isLoading) { [self loadData]; } } // MARK: - Lazy Loading - (UITableView *)tableView { if (!_tableView) { _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]; _tableView.delegate = self; _tableView.dataSource = self; _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; _tableView.backgroundColor = self.view.backgroundColor; _tableView.estimatedRowHeight = 200; _tableView.rowHeight = UITableViewAutomaticDimension; _tableView.showsVerticalScrollIndicator = NO; _tableView.contentInset = UIEdgeInsetsMake(10, 0, 10, 0); // 注册 Cell [_tableView registerClass:[NewMomentCell class] forCellReuseIdentifier:@"NewMomentCell"]; // 添加下拉刷新 _tableView.refreshControl = self.refreshControl; } return _tableView; } - (UIRefreshControl *)refreshControl { if (!_refreshControl) { _refreshControl = [[UIRefreshControl alloc] init]; [_refreshControl addTarget:self action:@selector(onRefresh) forControlEvents:UIControlEventValueChanged]; } return _refreshControl; } - (UIButton *)publishButton { if (!_publishButton) { _publishButton = [UIButton buttonWithType:UIButtonTypeCustom]; _publishButton.backgroundColor = [UIColor colorWithRed:0.2 green:0.6 blue:0.86 alpha:1.0]; // 主色调 _publishButton.layer.cornerRadius = 28; _publishButton.layer.shadowColor = [UIColor blackColor].CGColor; _publishButton.layer.shadowOffset = CGSizeMake(0, 2); _publishButton.layer.shadowOpacity = 0.3; _publishButton.layer.shadowRadius = 4; // 设置图标(暂时使用文字) [_publishButton setTitle:@"+" forState:UIControlStateNormal]; _publishButton.titleLabel.font = [UIFont systemFontOfSize:32 weight:UIFontWeightLight]; [_publishButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [_publishButton addTarget:self action:@selector(onPublishButtonTapped) forControlEvents:UIControlEventTouchUpInside]; } return _publishButton; } - (NSMutableArray *)dataSource { if (!_dataSource) { _dataSource = [NSMutableArray array]; } return _dataSource; } @end