// // HomeHotVC.m // keyBoard // // Created by Mac on 2025/11/6. // #import "HomeHotVC.h" // 视图 #import "KBTopThreeView.h" #import "KBHomeVM.h" #import "KBCharacter.h" #import "HomeHotCell.h" #import "HomeRankVC.h" #import "KBSearchVC.h" #import "HomeRankDetailPopView.h" #import "LSTPopView.h" #import @interface HomeHotVC () // 顶部前三名视图 @property (nonatomic, strong) KBTopThreeView *topThreeView; /// 首页排行榜 VM @property (nonatomic, strong) KBHomeVM *homeVM; /// 完整的排行榜数据(接口返回) @property (nonatomic, copy) NSArray *allCharacters; /// 列表区域使用的数据:从第 4 名开始 @property (nonatomic, copy) NSArray *listCharacters; @end @interface HomeHotVC () @end @implementation HomeHotVC - (void)viewDidLoad { [super viewDidLoad]; // 搭建 UI [self.view addSubview:self.tableView]; [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.view); }]; // 顶部前三名作为 tableHeaderView(注意:tableHeaderView 需设定明确高度) CGFloat headerH = 280.0; self.topThreeView = [[KBTopThreeView alloc] initWithFrame:CGRectMake(0, 0, KB_SCREEN_WIDTH, headerH)]; self.tableView.tableHeaderView = self.topThreeView; // 请求排行榜数据 self.homeVM = [KBHomeVM new]; KBWeakSelf [self.homeVM fetchRankListWithParams:nil needShow:YES completion:^(NSArray * _Nullable list, NSError * _Nullable error) { if (error) { // 错误提示已经在 VM 内部通过 HUD 处理,这里不再重复提示 return; } weakSelf.allCharacters = list ?: @[]; // 顶部前三名数据:直接取前三个模型交给 KBTopThreeView NSInteger topCount = MIN(3, weakSelf.allCharacters.count); if (topCount > 0) { NSRange range = NSMakeRange(0, topCount); NSArray *topThree = [weakSelf.allCharacters subarrayWithRange:range]; [weakSelf.topThreeView configWithCharacters:topThree]; } // 列表部分:从第 4 名开始 if (weakSelf.allCharacters.count > 3) { NSRange range = NSMakeRange(3, weakSelf.allCharacters.count - 3); weakSelf.listCharacters = [weakSelf.allCharacters subarrayWithRange:range]; } else { weakSelf.listCharacters = @[]; } [weakSelf.tableView reloadData]; // 通知承载 HomeHotVC 的“外层 PanModal 容器”刷新布局。 // 1) 如果 HomeHotVC 是作为子控制器嵌在某个 VC 里(例如 HomeSheetVC), // 则该 VC 实现了 hw_panModalSetNeedsLayoutUpdate。 UIViewController *parent = weakSelf.parentViewController; id target = nil; if ([parent respondsToSelector:@selector(hw_panModalSetNeedsLayoutUpdate)]) { target = parent; } else { // 2) 如果 HomeHotVC 是直接嵌在 HWPanModalContentView(如 KBPanModalView)里, // parentViewController 可能为 nil,需要顺着 view.superview 向上寻找。 UIView *v = weakSelf.view; while (v && ![v respondsToSelector:@selector(hw_panModalSetNeedsLayoutUpdate)]) { v = v.superview; } if (v && [v respondsToSelector:@selector(hw_panModalSetNeedsLayoutUpdate)]) { target = v; } } if (target) { [(id)target hw_panModalSetNeedsLayoutUpdate]; } }]; } #pragma mark - UITableViewDataSource - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.listCharacters.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { HomeHotCell *cell = [tableView dequeueReusableCellWithIdentifier:HomeHotCell.reuseId forIndexPath:indexPath]; KBCharacter *item = self.listCharacters[indexPath.row]; // 直接把模型交给 cell,由 cell 自己负责展示 cell.character = item; return cell; } #pragma mark - UITableViewDelegate - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 84.0; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; // KBSearchVC *vc = [[KBSearchVC alloc] init]; // [self.navigationController pushViewController:vc animated:true]; // UINavigationController *nav = KB_CURRENT_NAV; // [nav pushViewController:vc animated:true]; NSLog(@"==="); // 点击卡片 -> 展示弹窗 KBCharacter *c = self.listCharacters[indexPath.row]; // 自定义内容视图(尺寸可按需调节) CGFloat width = MIN(KB_SCREEN_WIDTH - 76, 420); HomeRankDetailPopView *content = [[HomeRankDetailPopView alloc] initWithFrame:CGRectMake(0, 0, width, 460)]; NSString *title = c.characterName ?: @"High EQ"; NSString *people = c.download ?: @"Download: 1 Million"; NSString *desc = @"Be Neither Too Close\nNor Too Distant"; // 示例文案 [content configWithAvatar:nil title:title download:people desc:desc]; // 创建并弹出 LSTPopView *pop = [LSTPopView initWithCustomView:content parentView:nil popStyle:LSTPopStyleScale dismissStyle:LSTDismissStyleScale]; pop.hemStyle = LSTHemStyleCenter; // 居中 pop.bgColor = [[UIColor blackColor] colorWithAlphaComponent:0.4]; pop.isClickBgDismiss = YES; // 点击背景关闭 pop.cornerRadius = 0; // 自定义 view 自处理圆角 __weak typeof(pop) weakPop = pop; content.saveHandler = ^{ [weakPop dismiss]; }; content.closeHandler = ^{ [weakPop dismiss]; }; [pop pop]; } #pragma mark - Lazy - (BaseTableView *)tableView { if (!_tableView) { // 使用 BaseTableView,统一默认配置 _tableView = [[BaseTableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]; _tableView.dataSource = self; _tableView.delegate = self; _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; // 设计为卡片式,去掉系统分割线 _tableView.showsVerticalScrollIndicator = NO; _tableView.contentInset = UIEdgeInsetsMake(8, 0, KB_SafeAreaBottom(), 0); [_tableView registerClass:HomeHotCell.class forCellReuseIdentifier:HomeHotCell.reuseId]; } return _tableView; } @end