// // MyVC.m // keyBoard // // Created by Mac on 2025/10/29. // #import "MyVC.h" #import "MySkinVC.h" #import "KBSkinDetailVC.h" #import "KBMyHeaderView.h" // 顶部视图独立封装 #import "KBMyListCell.h" #import "KBTestVC.h" #import "KBNoticeVC.h" #import "KBFeedBackVC.h" #import "KBMyVM.h" @interface MyVC () @property (nonatomic, strong) BaseTableView *tableView; // 列表 @property (nonatomic, strong) KBMyHeaderView *header; // 顶部视图 @property (nonatomic, strong) NSArray *> *data; // 分组数据 @property (nonatomic, strong) UIImageView *bgImageView; // 全屏背景图 @property (nonatomic, strong) KBMyVM *viewModel; // 我的页面 VM @end @implementation MyVC - (void)viewDidLoad { [super viewDidLoad]; // 背景图 self.view.backgroundColor = UIColor.clearColor; self.kb_navView.hidden = true; self.bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"my_bg_icon"]]; self.bgImageView.contentMode = UIViewContentModeScaleAspectFill; [self.view addSubview:self.bgImageView]; [self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.view); }]; // 数据源(title + SF Symbols 名称 + 色值),分两组 self.data = @[ @[@{ @"title": KBLocalized(@"Notice"), @"icon": @"my_notice_icon", @"color": @(0x60A3FF),@"id":@"1" }], @[@{ @"title": KBLocalized(@"Share App"), @"icon": @"my_share_icon", @"color": @(0xF5A623),@"id":@"2" }], @[@{ @"title": KBLocalized(@"Feedback"), @"icon": @"my_feedback_icon", @"color": @(0xB06AFD),@"id":@"3" }, @{ @"title": KBLocalized(@"E-mail"), @"icon": @"my_email_icon", @"color": @(0xFF8A65),@"id":@"4" }, @{ @"title": KBLocalized(@"Agreement"), @"icon": @"my_agreement_icon", @"color": @(0x4CD964),@"id":@"5" }, @{ @"title": KBLocalized(@"Privacy Policy"), @"icon": @"my_privacy_icon", @"color": @(0x5AC8FA),@"id":@"6" }, @{ @"title": KBLocalized(@"测试"), @"icon": @"", @"color": @(0x5AC8FA),@"id":@"7" }, ] ]; [self.view addSubview:self.tableView]; [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.view); }]; // tableHeaderView 需要设置 frame,约束不会自动生效 self.header = [[KBMyHeaderView alloc] initWithFrame:CGRectMake(0, 0, KB_SCREEN_WIDTH, 357)]; self.header.backgroundColor = UIColor.clearColor; // 透明,显示背景图 self.tableView.tableHeaderView = self.header; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // 每次进入“我的”页面时请求用户详情 if (!self.viewModel) { self.viewModel = [[KBMyVM alloc] init]; } __weak typeof(self) weakSelf = self; [self.viewModel fetchUserDetailWithCompletion:^(KBUser * _Nullable user, NSError * _Nullable error) { if (user) { [weakSelf.header configureWithUser:user]; } }]; } // 系统导航栏的显隐由 BaseViewController 统一处理(始终隐藏),此处无需再设置。 #pragma mark - UITableView - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return self.data.count; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.data[section].count; } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return CGFLOAT_MIN; } - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView *v = [UIView new]; v.backgroundColor = [UIColor clearColor]; return v; } - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { return 20; } - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { UIView *v = [UIView new]; v.backgroundColor = UIColor.clearColor; return v; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 64; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { KBMyListCell *cell = [tableView dequeueReusableCellWithIdentifier:[KBMyListCell reuseId]]; if (!cell) { cell = [[KBMyListCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[KBMyListCell reuseId]]; } NSDictionary *info = self.data[indexPath.section][indexPath.row]; cell.itemInfoDic = info; // 卡片圆角(每个 section 四周 8 的圆角) NSInteger rows = [tableView numberOfRowsInSection:indexPath.section]; BOOL isFirst = indexPath.row == 0; BOOL isLast = indexPath.row == rows - 1; [cell applyCornersWithFirst:isFirst last:isLast]; // 分割线:仅上面一组显示中间线;下面一组完全不显示 BOOL showLine = (indexPath.section == 0) && !isLast; [cell setLineHidden:!showLine]; return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; NSDictionary *info = self.data[indexPath.section][indexPath.row]; NSString *itemID = info[@"id"]; if ([itemID isEqualToString:@"1"]) { [self.navigationController pushViewController:[KBNoticeVC new] animated:true]; }else if ([itemID isEqualToString:@"2"]){ }else if ([itemID isEqualToString:@"3"]){ [self.navigationController pushViewController:[KBFeedBackVC new] animated:true]; }else if ([itemID isEqualToString:@"4"]){ }else if ([itemID isEqualToString:@"5"]){ }else if ([itemID isEqualToString:@"6"]){ }else if ([itemID isEqualToString:@"7"]){ KBTestVC *vc = [[KBTestVC alloc] init]; [self.navigationController pushViewController:vc animated:true]; } } #pragma mark - Lazy - (BaseTableView *)tableView { if (!_tableView) { _tableView = [[BaseTableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped]; _tableView.backgroundColor = UIColor.clearColor; // 透明 _tableView.opaque = NO; _tableView.delegate = self; _tableView.dataSource = self; _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; // 关闭系统分割线 } return _tableView; } @end