
问题: - keyWindow 在 iOS 13+ 被废弃 - 使用 kWindow 会产生 deprecation warning - 不支持 multi-scene 应用 修复: - 添加 getKeyWindow 辅助方法 - iOS 13+: 使用 connectedScenes 获取活跃 window - iOS 13-: 使用旧的 keyWindow(suppress warning) - 确保兼容性和 multi-scene 支持 代码改进: - 使用 @available(iOS 13.0, *) 条件编译 - 使用 #pragma clang diagnostic 抑制旧 API 警告 - 遍历所有 scene 找到前台活跃的 window 现在可以在 iOS 13+ 上无警告编译和运行。
285 lines
9.6 KiB
Objective-C
285 lines
9.6 KiB
Objective-C
//
|
||
// NewMineViewController.m
|
||
// YuMi
|
||
//
|
||
// Created by AI on 2025-10-09.
|
||
// Copyright © 2025 YuMi. All rights reserved.
|
||
//
|
||
|
||
#import "NewMineViewController.h"
|
||
#import "NewMineHeaderView.h"
|
||
#import <Masonry/Masonry.h>
|
||
#import "Api+Mine.h"
|
||
#import "AccountInfoStorage.h"
|
||
#import "UserInfoModel.h"
|
||
#import "WalletInfoModel.h"
|
||
#import <MJExtension/MJExtension.h>
|
||
#import "XPSkillCardPlayerManager.h"
|
||
|
||
@interface NewMineViewController () <UITableViewDelegate, UITableViewDataSource>
|
||
|
||
// MARK: - UI Components
|
||
|
||
/// 主列表
|
||
@property (nonatomic, strong) UITableView *tableView;
|
||
|
||
/// 顶部个人信息卡片
|
||
@property (nonatomic, strong) NewMineHeaderView *headerView;
|
||
|
||
/// 设置按钮
|
||
@property (nonatomic, strong) UIButton *settingsButton;
|
||
|
||
// MARK: - Data
|
||
|
||
/// 菜单项数据源
|
||
@property (nonatomic, strong) NSArray<NSDictionary *> *menuItems;
|
||
|
||
/// 用户信息模型
|
||
@property (nonatomic, strong) UserInfoModel *userInfo;
|
||
|
||
/// 钱包信息模型
|
||
@property (nonatomic, strong) WalletInfoModel *walletInfo;
|
||
|
||
@end
|
||
|
||
@implementation NewMineViewController
|
||
|
||
// 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 setupNavigationBar];
|
||
[self setupUI];
|
||
[self loadData];
|
||
|
||
NSLog(@"[NewMineViewController] 页面加载完成");
|
||
}
|
||
|
||
- (void)viewWillAppear:(BOOL)animated {
|
||
[super viewWillAppear:animated];
|
||
|
||
// 刷新用户信息
|
||
[self refreshUserInfo];
|
||
}
|
||
|
||
// MARK: - Setup
|
||
|
||
- (void)setupNavigationBar {
|
||
// 设置按钮(右上角)
|
||
self.settingsButton = [UIButton buttonWithType:UIButtonTypeSystem];
|
||
[self.settingsButton setTitle:@"⚙️" forState:UIControlStateNormal];
|
||
self.settingsButton.titleLabel.font = [UIFont systemFontOfSize:24];
|
||
[self.settingsButton addTarget:self action:@selector(onSettingsButtonTapped) forControlEvents:UIControlEventTouchUpInside];
|
||
|
||
UIBarButtonItem *settingsBarButton = [[UIBarButtonItem alloc] initWithCustomView:self.settingsButton];
|
||
self.navigationItem.rightBarButtonItem = settingsBarButton;
|
||
}
|
||
|
||
- (void)setupUI {
|
||
// TableView
|
||
[self.view addSubview:self.tableView];
|
||
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.edges.equalTo(self.view);
|
||
}];
|
||
|
||
// 设置头部视图
|
||
self.tableView.tableHeaderView = self.headerView;
|
||
|
||
NSLog(@"[NewMineViewController] UI 设置完成");
|
||
}
|
||
|
||
// MARK: - Data Loading
|
||
|
||
- (void)loadData {
|
||
// 菜单项配置(完全不同的顺序和图标)
|
||
self.menuItems = @[
|
||
@{@"title": @"💎 我的钱包", @"type": @"wallet"},
|
||
@{@"title": @"📊 数据统计", @"type": @"stats"},
|
||
@{@"title": @"⭐️ 我的收藏", @"type": @"favorites"},
|
||
@{@"title": @"📝 编辑资料", @"type": @"profile"},
|
||
@{@"title": @"🔔 消息通知", @"type": @"notifications"},
|
||
@{@"title": @"🎨 主题设置", @"type": @"theme"},
|
||
@{@"title": @"🌐 语言切换", @"type": @"language"},
|
||
@{@"title": @"ℹ️ 关于我们", @"type": @"about"},
|
||
];
|
||
|
||
[self.tableView reloadData];
|
||
}
|
||
|
||
- (void)refreshUserInfo {
|
||
NSString *uid = [[AccountInfoStorage instance] getUid];
|
||
if (!uid.length) {
|
||
NSLog(@"[NewMineViewController] 未登录,无法获取用户信息");
|
||
return;
|
||
}
|
||
|
||
// 调用真实 API 获取用户信息
|
||
[Api getUserInfo:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
|
||
if (code == 200 && data.data) {
|
||
self.userInfo = [UserInfoModel mj_objectWithKeyValues:data.data];
|
||
|
||
// 更新头部视图
|
||
NSDictionary *userInfoDict = @{
|
||
@"nickname": self.userInfo.nick ?: @"未设置昵称",
|
||
@"avatar": self.userInfo.avatar ?: @"",
|
||
// @"level": @(self.userInfo.charmLevel),
|
||
// @"exp": @(self.userInfo.charmLevelExp),
|
||
// @"nextLevelExp": @(self.userInfo.nextCharmLevelExp),
|
||
@"followers": @(self.userInfo.fansNum),
|
||
@"following": @(self.userInfo.followNum),
|
||
};
|
||
|
||
[self.headerView configureWithUserInfo:userInfoDict];
|
||
NSLog(@"[NewMineViewController] 用户信息加载成功: %@", self.userInfo.nick);
|
||
} else {
|
||
NSLog(@"[NewMineViewController] 用户信息加载失败: %@", msg);
|
||
}
|
||
} uid:uid];
|
||
|
||
// 同时获取钱包信息
|
||
[self refreshWalletInfo];
|
||
}
|
||
|
||
- (void)refreshWalletInfo {
|
||
NSString *uid = [[AccountInfoStorage instance] getUid];
|
||
NSString *ticket = [[AccountInfoStorage instance] getTicket];
|
||
|
||
if (!uid.length || !ticket.length) return;
|
||
|
||
|
||
// TODO: 使用 api-presnter, 参照其他 VC
|
||
|
||
// [Api getUserWalletInfo:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
|
||
// if (code == 200 && data.data) {
|
||
// self.walletInfo = [WalletInfoModel mj_objectWithKeyValues:data.data];
|
||
// NSLog(@"[NewMineViewController] 钱包信息加载成功: 钻石=%ld 金币=%ld",
|
||
// (long)self.walletInfo.diamond, (long)self.walletInfo.money);
|
||
// }
|
||
// } fail:^(NSInteger code, NSString * _Nullable msg) {
|
||
// NSLog(@"[NewMineViewController] 钱包信息加载失败: %@", msg);
|
||
// } uid:uid ticket:ticket];
|
||
}
|
||
|
||
// MARK: - Actions
|
||
|
||
- (void)onSettingsButtonTapped {
|
||
NSLog(@"[NewMineViewController] 设置按钮点击");
|
||
// TODO: 跳转到设置页面
|
||
[self showAlertWithMessage:@"设置功能开发中"];
|
||
}
|
||
|
||
- (void)onMenuItemTapped:(NSDictionary *)item {
|
||
NSString *type = item[@"type"];
|
||
NSString *title = item[@"title"];
|
||
|
||
NSLog(@"[NewMineViewController] 菜单项点击: %@", type);
|
||
|
||
if ([type isEqualToString:@"wallet"]) {
|
||
// TODO: 跳转到钱包页面
|
||
[self showAlertWithMessage:@"钱包功能开发中"];
|
||
} else if ([type isEqualToString:@"stats"]) {
|
||
// TODO: 跳转到数据统计页面
|
||
[self showAlertWithMessage:@"数据统计功能开发中"];
|
||
} else if ([type isEqualToString:@"favorites"]) {
|
||
// TODO: 跳转到收藏页面
|
||
[self showAlertWithMessage:@"收藏功能开发中"];
|
||
} else if ([type isEqualToString:@"profile"]) {
|
||
// TODO: 跳转到编辑资料页面
|
||
[self showAlertWithMessage:@"编辑资料功能开发中"];
|
||
} else {
|
||
[self showAlertWithMessage:[NSString stringWithFormat:@"%@ 功能开发中", title]];
|
||
}
|
||
}
|
||
|
||
- (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)numberOfSectionsInTableView:(UITableView *)tableView {
|
||
return 1;
|
||
}
|
||
|
||
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
|
||
return self.menuItems.count;
|
||
}
|
||
|
||
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||
static NSString *identifier = @"MenuCell";
|
||
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
|
||
|
||
if (!cell) {
|
||
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
|
||
cell.backgroundColor = [UIColor whiteColor];
|
||
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
|
||
cell.textLabel.font = [UIFont systemFontOfSize:15];
|
||
cell.textLabel.textColor = [UIColor colorWithWhite:0.2 alpha:1.0];
|
||
}
|
||
|
||
if (indexPath.row < self.menuItems.count) {
|
||
NSDictionary *item = self.menuItems[indexPath.row];
|
||
cell.textLabel.text = item[@"title"];
|
||
}
|
||
|
||
return cell;
|
||
}
|
||
|
||
// MARK: - UITableViewDelegate
|
||
|
||
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
|
||
[tableView deselectRowAtIndexPath:indexPath animated:YES];
|
||
|
||
if (indexPath.row < self.menuItems.count) {
|
||
NSDictionary *item = self.menuItems[indexPath.row];
|
||
[self onMenuItemTapped:item];
|
||
}
|
||
}
|
||
|
||
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||
return 56; // 卡片式高度
|
||
}
|
||
|
||
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
|
||
return 15; // 上间距
|
||
}
|
||
|
||
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
|
||
UIView *header = [[UIView alloc] init];
|
||
header.backgroundColor = [UIColor clearColor];
|
||
return header;
|
||
}
|
||
|
||
// MARK: - Lazy Loading
|
||
|
||
- (UITableView *)tableView {
|
||
if (!_tableView) {
|
||
_tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
|
||
_tableView.delegate = self;
|
||
_tableView.dataSource = self;
|
||
_tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
|
||
_tableView.separatorInset = UIEdgeInsetsMake(0, 15, 0, 15);
|
||
_tableView.backgroundColor = self.view.backgroundColor;
|
||
_tableView.showsVerticalScrollIndicator = NO;
|
||
_tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
|
||
}
|
||
return _tableView;
|
||
}
|
||
|
||
- (NewMineHeaderView *)headerView {
|
||
if (!_headerView) {
|
||
_headerView = [[NewMineHeaderView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 280)];
|
||
}
|
||
return _headerView;
|
||
}
|
||
|
||
@end
|