// // EPMineViewController.m // YuMi // // Created by AI on 2025-10-09. // Copyright © 2025 YuMi. All rights reserved. // #import "EPMineViewController.h" #import "EPMineHeaderView.h" #import "EPMomentListView.h" #import "EPMineAPIHelper.h" #import "AccountInfoStorage.h" #import "UserInfoModel.h" #import #import "YuMi-Swift.h" // 导入Swift桥接 @interface EPMineViewController () // MARK: - UI Components /// 动态列表视图(复用 EPMomentListView) @property (nonatomic, strong) EPMomentListView *momentListView; /// 顶部个人信息卡片 @property (nonatomic, strong) EPMineHeaderView *headerView; // MARK: - Data /// 用户信息模型 @property (nonatomic, strong) UserInfoModel *userInfo; /// API Helper @property (nonatomic, strong) EPMineAPIHelper *apiHelper; @end @implementation EPMineViewController // MARK: - Lifecycle - (void)viewDidLoad { [super viewDidLoad]; [self setupUI]; NSLog(@"[EPMineViewController] viewDidLoad 完成"); } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController setNavigationBarHidden:YES animated:animated]; // 每次显示时加载最新数据 [self loadUserDetailInfo]; } // MARK: - Setup - (void)setupUI { UIImageView *bgImageView = [[UIImageView alloc] initWithImage:kImage(@"vc_bg")]; bgImageView.contentMode = UIViewContentModeScaleAspectFill; bgImageView.clipsToBounds = YES; [self.view addSubview:bgImageView]; [bgImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.view); }]; [self setupHeaderView]; [self setupMomentListView]; NSLog(@"[EPMineViewController] UI 设置完成"); } - (void)setupHeaderView { self.headerView = [[EPMineHeaderView alloc] initWithFrame:CGRectZero]; [self.view addSubview:self.headerView]; // 使用 Masonry 约束布局 [self.headerView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.view); make.leading.mas_equalTo(self.view); make.trailing.mas_equalTo(self.view); make.height.mas_equalTo(kGetScaleWidth(260)); }]; // 设置按钮点击回调 __weak typeof(self) weakSelf = self; self.headerView.onSettingsButtonTapped = ^{ __strong typeof(weakSelf) self = weakSelf; [self openSettings]; }; // 监听头像更新事件 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAvatarUpdated:) name:@"EPEditSettingAvatarUpdated" object:nil]; } - (void)setupMomentListView { self.momentListView = [[EPMomentListView alloc] initWithFrame:CGRectZero]; [self.view addSubview:self.momentListView]; [self.momentListView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.headerView.mas_bottom); make.bottom.mas_equalTo(self.view); make.leading.mas_equalTo(self.view); make.trailing.mas_equalTo(self.view); }]; } // MARK: - Data Loading - (void)loadUserDetailInfo { NSString *uid = [[AccountInfoStorage instance] getUid]; if (!uid || uid.length == 0) { NSLog(@"[EPMineViewController] 用户未登录"); return; } @kWeakify(self); [self.apiHelper getUserDetailInfoWithUid:uid completion:^(UserInfoModel * _Nullable userInfo) { @kStrongify(self); if (!userInfo) { NSLog(@"[EPMineViewController] 加载用户信息失败"); return; } self.userInfo = userInfo; [self updateHeaderWithUserInfo:userInfo]; // 如果有动态信息,直接使用 if (userInfo.dynamicInfo && userInfo.dynamicInfo.count > 0) { [self.momentListView loadWithDynamicInfo:userInfo.dynamicInfo refreshCallback:^{ [self loadUserDetailInfo]; // 刷新时重新加载 }]; } } failure:^(NSInteger code, NSString * _Nullable msg) { NSLog(@"[EPMineViewController] 加载用户信息失败: %@", msg); }]; } - (void)updateHeaderWithUserInfo:(UserInfoModel *)userInfo { NSDictionary *userInfoDict = @{ @"nickname": userInfo.nick ?: @"未设置昵称", @"uid": [NSString stringWithFormat:@"%ld", (long)userInfo.uid], @"avatar": userInfo.avatar ?: @"", @"following": @(userInfo.followNum), @"followers": @(userInfo.fansNum) }; [self.headerView updateWithUserInfo:userInfoDict]; } // MARK: - Lazy Loading - (EPMomentListView *)momentListView { if (!_momentListView) { _momentListView = [[EPMomentListView alloc] init]; __weak typeof(self) weakSelf = self; _momentListView.onSelectMoment = ^(NSInteger index) { __strong typeof(weakSelf) self = weakSelf; NSLog(@"[EPMineViewController] 点击了第 %ld 条动态", (long)index); // TODO: 跳转到动态详情页 }; } return _momentListView; } - (EPMineAPIHelper *)apiHelper { if (!_apiHelper) { _apiHelper = [[EPMineAPIHelper alloc] init]; } return _apiHelper; } // MARK: - Actions - (void)openSettings { // 隐藏返回按钮文字,只保留白色箭头 self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; EPEditSettingViewController *settingsVC = [[EPEditSettingViewController alloc] init]; // 传递用户信息到设置页面 if (self.userInfo) { [settingsVC updateWithUserInfo:self.userInfo]; } [self.navigationController pushViewController:settingsVC animated:YES]; NSLog(@"[EPMineViewController] 打开设置页面,已传递用户信息"); } - (void)onAvatarUpdated:(NSNotification *)notification { NSString *avatarUrl = notification.userInfo[@"avatarUrl"]; if (avatarUrl && self.userInfo) { // 更新本地用户信息 self.userInfo.avatar = avatarUrl; // 更新 UI 显示 [self updateHeaderWithUserInfo:self.userInfo]; NSLog(@"[EPMineViewController] 头像已更新: %@", avatarUrl); } } - (void)dealloc { // 只移除头像更新通知的观察者,设置按钮现在使用 block 回调 [[NSNotificationCenter defaultCenter] removeObserver:self name:@"EPEditSettingAvatarUpdated" object:nil]; } @end