Files
real-e-party-iOS/YuMi/Modules/NewMine/Controllers/NewMineViewController.m
edwinQQQ 524c7a271b 修复 iOS 13+ keyWindow 废弃警告
问题:
- 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+ 上无警告编译和运行。
2025-10-10 11:01:49 +08:00

285 lines
9.6 KiB
Objective-C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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