移除公共房间管理器中的配置更新通知逻辑,新增 RtcManager 的代理更新方法以支持动态代理切换,优化 StageViewManager 的清理逻辑,确保在清理过程中正确处理视图层级和内存管理,同时更新本地化字符串以提升用户体验。
This commit is contained in:
@@ -106,9 +106,6 @@
|
||||
|
||||
self.configInfo = model;
|
||||
|
||||
// 通知公共房间管理器配置已更新
|
||||
[[PublicRoomManager sharedManager] updateConfig];
|
||||
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadAfterLoadConfig" object:nil];
|
||||
|
||||
[self requestFaceTabNewList];
|
||||
|
@@ -139,6 +139,10 @@ typedef NS_ENUM(NSInteger, BackMusicPlayState) {
|
||||
- (NSInteger)loadUserSound;
|
||||
|
||||
@property (nonatomic,assign) BOOL broadcast;
|
||||
|
||||
// MARK: 指向实际使用的 stageView
|
||||
- (void)updateDelegate:(id<RtcDelegate> _Nullable)delegate;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
@@ -194,6 +194,10 @@ UIKIT_EXTERN NSString * kRoomBackMusicCaptureVolumeKey;
|
||||
_engineDelegate = delegate;
|
||||
}
|
||||
|
||||
- (void)updateDelegate:(id<RtcDelegate> _Nullable)delegate {
|
||||
_engineDelegate = delegate;
|
||||
}
|
||||
|
||||
- (id<RtcInterface>)engine {
|
||||
if (!_engine) {
|
||||
_engine = [[TRTCRtcImpl alloc] initWithDelegate:self];
|
||||
|
@@ -125,19 +125,11 @@
|
||||
#pragma mark - 私有方法
|
||||
|
||||
- (void)tryEnterPublicRoom {
|
||||
NSLog(@"PublicRoomManager: 开始尝试进入公共房间");
|
||||
NSLog(@"PublicRoomManager: 当前状态 - isInitialized: %@, isInPublicRoom: %@, currentPublicRoomId: %@",
|
||||
self.isInitialized ? @"YES" : @"NO",
|
||||
self.isInPublicRoom ? @"YES" : @"NO",
|
||||
self.currentPublicRoomId ?: @"nil");
|
||||
|
||||
if (!self.isInitialized) {
|
||||
NSLog(@"PublicRoomManager: 管理器未初始化,无法进入公共房间");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!self.userInfo) {
|
||||
NSLog(@"PublicRoomManager: 用户信息缺失,无法进入公共房间");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -146,29 +138,19 @@
|
||||
ClientDataModel *configInfo = [ClientConfig shareConfig].configInfo;
|
||||
NSDictionary *publicChatRoomIdMap = configInfo.publicChatRoomIdMap;
|
||||
|
||||
NSLog(@"PublicRoomManager: 配置信息 - partitionId: %@, configInfo: %@, publicChatRoomIdMap: %@",
|
||||
partitionId ?: @"nil",
|
||||
configInfo ? @"存在" : @"nil",
|
||||
publicChatRoomIdMap ? @"存在" : @"nil");
|
||||
|
||||
if (!publicChatRoomIdMap) {
|
||||
NSLog(@"PublicRoomManager: 公共房间配置缺失");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!partitionId) {
|
||||
NSLog(@"PublicRoomManager: 分区ID缺失");
|
||||
return;
|
||||
}
|
||||
|
||||
NSNumber *roomId = publicChatRoomIdMap[partitionId];
|
||||
if (!roomId) {
|
||||
NSLog(@"PublicRoomManager: 未找到分区 %@ 对应的公共房间ID", partitionId);
|
||||
return;
|
||||
}
|
||||
|
||||
NSLog(@"PublicRoomManager: 尝试进入公共房间,分区ID: %@, 房间ID: %@", partitionId, roomId);
|
||||
|
||||
|
||||
// 进入公共房间
|
||||
[self enterPublicRoomWithRoomId:roomId.stringValue completion:^(NSError * _Nullable error) {
|
||||
if (error) {
|
||||
@@ -227,12 +209,10 @@
|
||||
@kStrongify(self);
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
if (error) {
|
||||
NSLog(@"PublicRoomManager: 进入公共房间失败: %@", error);
|
||||
if (completion) {
|
||||
completion(error);
|
||||
}
|
||||
} else {
|
||||
NSLog(@"PublicRoomManager: 进入公共房间成功,房间ID: %@", roomId);
|
||||
self.isInPublicRoom = YES;
|
||||
self.currentPublicRoomId = roomId;
|
||||
if (completion) {
|
||||
@@ -253,20 +233,15 @@
|
||||
if (completion) {
|
||||
completion(error);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (self.isInPublicRoom) {
|
||||
NSLog(@"PublicRoomManager: 已在公共房间中");
|
||||
} else if (self.isInPublicRoom) {
|
||||
if (completion) {
|
||||
completion(nil);
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
[self tryEnterPublicRoom];
|
||||
});
|
||||
}
|
||||
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
[self tryEnterPublicRoom];
|
||||
});
|
||||
}
|
||||
|
||||
- (void)exitPublicRoomWithCompletion:(void(^)(NSError * _Nullable error))completion {
|
||||
@@ -285,9 +260,9 @@
|
||||
@kStrongify(self);
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
if (error) {
|
||||
NSLog(@"PublicRoomManager: 退出公共房间失败: %@", error);
|
||||
// NSLog(@"PublicRoomManager: 退出公共房间失败: %@", error);
|
||||
} else {
|
||||
NSLog(@"PublicRoomManager: 退出公共房间成功");
|
||||
// NSLog(@"PublicRoomManager: 退出公共房间成功");
|
||||
self.isInPublicRoom = NO;
|
||||
self.currentPublicRoomId = nil;
|
||||
}
|
||||
@@ -301,69 +276,23 @@
|
||||
#pragma mark - 用户信息更新处理
|
||||
|
||||
- (void)updateUserInfo:(UserInfoModel *)userInfo {
|
||||
NSLog(@"PublicRoomManager: 开始更新用户信息");
|
||||
NSLog(@"PublicRoomManager: 用户信息 - uid: %ld, partitionId: %@",
|
||||
userInfo.uid, userInfo.partitionId ?: @"nil");
|
||||
|
||||
if (!userInfo) {
|
||||
NSLog(@"PublicRoomManager: 用户信息为空,更新失败");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!userInfo.partitionId) {
|
||||
NSLog(@"PublicRoomManager: 用户分区ID缺失,更新失败");
|
||||
return;
|
||||
}
|
||||
|
||||
// 检查用户是否切换
|
||||
if (self.currentUserId && ![self.currentUserId isEqualToString:[NSString stringWithFormat:@"%ld", userInfo.uid]]) {
|
||||
NSLog(@"PublicRoomManager: 检测到用户切换,重置管理器");
|
||||
[self reset];
|
||||
}
|
||||
|
||||
self.userInfo = userInfo;
|
||||
self.currentUserId = [NSString stringWithFormat:@"%ld", userInfo.uid];
|
||||
if (![self checkConfigPublicRoomID:@(userInfo.uid).stringValue]) {
|
||||
return;
|
||||
}
|
||||
|
||||
NSLog(@"PublicRoomManager: 用户信息更新完成 - currentUserId: %@, isInitialized: %@, isInPublicRoom: %@",
|
||||
self.currentUserId,
|
||||
self.isInitialized ? @"YES" : @"NO",
|
||||
self.isInPublicRoom ? @"YES" : @"NO");
|
||||
|
||||
// 注释掉自动进入房间逻辑,改为统一入口控制
|
||||
// 如果已初始化但未在公共房间,尝试进入
|
||||
// if (self.isInitialized && !self.isInPublicRoom) {
|
||||
// NSLog(@"PublicRoomManager: 条件满足,开始尝试进入公共房间");
|
||||
// [self tryEnterPublicRoom];
|
||||
// } else {
|
||||
// NSLog(@"PublicRoomManager: 条件不满足,跳过进入公共房间 - isInitialized: %@, isInPublicRoom: %@",
|
||||
// self.isInitialized ? @"YES" : @"NO",
|
||||
// self.isInPublicRoom ? @"YES" : @"NO");
|
||||
// }
|
||||
}
|
||||
|
||||
#pragma mark - 配置更新处理
|
||||
|
||||
- (void)updateConfig {
|
||||
if (!self.isInitialized) {
|
||||
NSLog(@"PublicRoomManager: 未初始化,跳过配置更新");
|
||||
return;
|
||||
}
|
||||
|
||||
ClientDataModel *configInfo = [ClientConfig shareConfig].configInfo;
|
||||
if (!configInfo || !configInfo.publicChatRoomIdMap) {
|
||||
NSLog(@"PublicRoomManager: 配置信息不完整,跳过配置更新");
|
||||
return;
|
||||
}
|
||||
|
||||
// 注释掉自动进入房间逻辑,改为统一入口控制
|
||||
// 如果未在公共房间,尝试进入
|
||||
// if (!self.isInPublicRoom) {
|
||||
// [self tryEnterPublicRoom];
|
||||
// }
|
||||
}
|
||||
|
||||
#pragma mark - NIMChatRoomManagerDelegate
|
||||
#define ConnectionStateStyleString(enum) \
|
||||
|
@@ -160,7 +160,7 @@
|
||||
|
||||
- (void)setupUnderstandButton {
|
||||
self.understandButton = [UIButton buttonWithType:UIButtonTypeCustom];
|
||||
[self.understandButton setTitle:@"I understand" forState:UIControlStateNormal];
|
||||
[self.understandButton setTitle:YMLocalizedString(@"PKIDLoginViewController4") forState:UIControlStateNormal];
|
||||
[self.understandButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
|
||||
self.understandButton.titleLabel.font = [UIFont boldSystemFontOfSize:18.0];
|
||||
self.understandButton.backgroundColor = [UIColor colorWithRed:1.0 green:0.5 blue:0.0 alpha:1.0]; // 橙色
|
||||
|
@@ -75,10 +75,31 @@
|
||||
|
||||
- (void)cleanup {
|
||||
if (self.currentStageView) {
|
||||
[self.currentStageView removeFromSuperview];
|
||||
NSLog(@"🧹 StageViewManager: 开始清理 stageView | Type: %ld | Class: %@",
|
||||
(long)self.currentRoomType, NSStringFromClass([self.currentStageView class]));
|
||||
|
||||
// 1. 通知 stageView 进行清理操作
|
||||
if ([self.currentStageView respondsToSelector:@selector(exitNIMRoom)]) {
|
||||
[self.currentStageView exitNIMRoom];
|
||||
NSLog(@"🧹 StageViewManager: 已调用 stageView.exitNIMRoom");
|
||||
}
|
||||
|
||||
// 2. 移除所有子视图引用
|
||||
if (self.currentStageView.superview) {
|
||||
[self.currentStageView removeFromSuperview];
|
||||
NSLog(@"🧹 StageViewManager: stageView 已从 superview 移除");
|
||||
}
|
||||
|
||||
// 3. 清空所有子视图
|
||||
[self.currentStageView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
|
||||
|
||||
// 4. 释放 stageView 实例
|
||||
self.currentStageView = nil;
|
||||
NSLog(@"🧹 StageViewManager: 清理 stageView");
|
||||
NSLog(@"🧹 StageViewManager: stageView 清理完成");
|
||||
}
|
||||
|
||||
// 5. 清空容器引用
|
||||
self.container = nil;
|
||||
}
|
||||
|
||||
- (BOOL)shouldChangeStageViewType:(RoomType)newType {
|
||||
@@ -127,7 +148,10 @@
|
||||
self.currentStageView = [[TenMicStageView alloc] initWithDelegate:delegate];
|
||||
break;
|
||||
}
|
||||
case RoomType_Room: // RoomType_Game
|
||||
case RoomType_Room: { // RoomType_Game
|
||||
self.currentStageView = [[SocialStageView alloc] initWithDelegate:delegate];
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
self.currentStageView = [[SocialStageView alloc] initWithDelegate:delegate];
|
||||
break;
|
||||
|
@@ -138,10 +138,10 @@ XPCandyTreeInsufficientBalanceViewDelegate>
|
||||
///坑位信息
|
||||
@property (nonatomic,strong) StageView *stageView;
|
||||
@property (nonatomic,strong) StageViewManager *stageViewManager;
|
||||
@property (nonatomic,strong) TenMicStageView *tenMicStageView;
|
||||
@property (nonatomic,strong) FifteenMicStageView *fifteenMicStageView;
|
||||
@property (nonatomic,strong) TwentyMicStageView *twentyMicStageView;
|
||||
@property(nonatomic, strong) NineteenMicStageView *nineteenMicStageView;
|
||||
//@property (nonatomic,strong) TenMicStageView *tenMicStageView;
|
||||
//@property (nonatomic,strong) FifteenMicStageView *fifteenMicStageView;
|
||||
//@property (nonatomic,strong) TwentyMicStageView *twentyMicStageView;
|
||||
//@property(nonatomic, strong) NineteenMicStageView *nineteenMicStageView;
|
||||
///公屏
|
||||
@property (nonatomic,strong) MsRoomMessageMainView *messageContainerView;
|
||||
///快捷发言
|
||||
@@ -483,7 +483,7 @@ XPCandyTreeInsufficientBalanceViewDelegate>
|
||||
// 添加公共房间消息转发通知监听
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(handlePublicRoomMessageForward:)
|
||||
name:@"MessageFromPublicRoomWithAttachmentNotification"
|
||||
name:kMessageFromPublicRoomWithAttachmentNotification
|
||||
object:nil];
|
||||
|
||||
// 添加应用生命周期保护
|
||||
@@ -958,6 +958,7 @@ XPCandyTreeInsufficientBalanceViewDelegate>
|
||||
delegate:self];
|
||||
if (success) {
|
||||
self.stageView = self.stageViewManager.currentStageView;
|
||||
[[RtcManager instance] updateDelegate:self.stageView];
|
||||
if (self.stageView) {
|
||||
NSLog(@"🔧 updateStageView: StageViewManager 设置 alpha = 0 (之前 = %.2f)", self.stageView.alpha);
|
||||
self.stageView.alpha = 0;
|
||||
@@ -1025,8 +1026,11 @@ XPCandyTreeInsufficientBalanceViewDelegate>
|
||||
NSLog(@"❌ changeStageViewOnRoomUpdate: updateStageView 失败");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
NSLog(@"✅ changeStageViewOnRoomUpdate: updateStageView 成功,当前 alpha = %.2f", self.stageView.alpha);
|
||||
|
||||
// 🔧 新增:检查是否有重复的 StageView 实例
|
||||
[self checkForDuplicateStageViews];
|
||||
|
||||
// 🔧 新增:发送房间类型变化通知
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:@"RoomTypeChanged"
|
||||
@@ -1058,6 +1062,7 @@ XPCandyTreeInsufficientBalanceViewDelegate>
|
||||
|
||||
NSLog(@"🔧 changeStageViewOnRoomUpdate: 设置 stageView.alpha = 1 (之前 = %.2f)", self.stageView.alpha);
|
||||
self.stageView.alpha = 1;
|
||||
[[RtcManager instance] updateDelegate:(id<RtcDelegate>)self.stageView];
|
||||
NSLog(@"✅ changeStageViewOnRoomUpdate: stageView.alpha 已设置为 1");
|
||||
|
||||
// 调试:检查最终状态
|
||||
@@ -1144,6 +1149,51 @@ XPCandyTreeInsufficientBalanceViewDelegate>
|
||||
}
|
||||
|
||||
- (void)changeStageViewOnAnchorRoom {
|
||||
// 🔧 内存管理:清理旧的 stageView 实例
|
||||
if (self.stageView && self.stageView.superview && self.stageViewManager.currentStageView != self.stageView) {
|
||||
NSLog(@"🧹 changeStageViewOnAnchorRoom: 清理旧的 stageView 实例");
|
||||
[self.stageView removeFromSuperview];
|
||||
self.stageView = nil;
|
||||
}
|
||||
|
||||
// 使用 StageViewManager 来管理个播房间的 stageView 切换
|
||||
if (self.stageViewManager) {
|
||||
NSLog(@"🔧 changeStageViewOnAnchorRoom: 使用 StageViewManager 进行个播房间切换");
|
||||
BOOL success = [self.stageViewManager updateStageViewForRoomType:RoomType_Anchor
|
||||
roomInfo:self.roomInfo
|
||||
container:self.anchorScrollView
|
||||
delegate:self];
|
||||
if (success) {
|
||||
self.stageView = self.stageViewManager.currentStageView;
|
||||
if (self.stageView) {
|
||||
NSLog(@"✅ changeStageViewOnAnchorRoom: StageViewManager 成功切换 stageView: %@", NSStringFromClass([self.stageView class]));
|
||||
|
||||
// 确保 stageView 添加到正确的位置
|
||||
if (!self.stageView.superview) {
|
||||
[self.anchorScrollView insertSubview:self.stageView belowSubview:self.roomHeaderView];
|
||||
}
|
||||
|
||||
// 重新设置约束
|
||||
[self.stageView mas_remakeConstraints:^(MASConstraintMaker *make) {
|
||||
make.leading.trailing.mas_equalTo(self.anchorScrollView.middleImageView);
|
||||
make.top.mas_equalTo(self.roomHeaderView.mas_bottom);
|
||||
make.height.mas_equalTo(self.stageView.hightForStageView);
|
||||
}];
|
||||
|
||||
// 重新设置其他相关视图的约束
|
||||
[self updateAnchorRoomLayout];
|
||||
[[RtcManager instance] updateDelegate:(id<RtcDelegate>)self.stageView];
|
||||
return;
|
||||
}
|
||||
}
|
||||
NSLog(@"⚠️ changeStageViewOnAnchorRoom: StageViewManager 切换失败,尝试降级逻辑");
|
||||
}
|
||||
|
||||
// 🔧 新增:检查是否有重复的 StageView 实例
|
||||
[self checkForDuplicateStageViews];
|
||||
|
||||
// 降级逻辑:直接创建 stageView(保持原有逻辑作为兜底)
|
||||
NSLog(@"🔧 changeStageViewOnAnchorRoom: 使用降级逻辑创建 stageView");
|
||||
if (self.roomInfo.roomModeType == RoomModeType_Open_AcrossRoomPK_mode && ![self.stageView isKindOfClass:[AnchorPKStageView class]]) {
|
||||
[self.stageView removeFromSuperview];
|
||||
self.stageView = nil;
|
||||
@@ -1156,19 +1206,25 @@ XPCandyTreeInsufficientBalanceViewDelegate>
|
||||
if (!self.stageView.superview) {
|
||||
[self.anchorScrollView insertSubview:self.stageView belowSubview:self.roomHeaderView];
|
||||
}
|
||||
|
||||
|
||||
[self.stageView mas_remakeConstraints:^(MASConstraintMaker *make) {
|
||||
make.leading.trailing.mas_equalTo(self.anchorScrollView.middleImageView);
|
||||
make.top.mas_equalTo(self.roomHeaderView.mas_bottom);
|
||||
make.height.mas_equalTo(self.stageView.hightForStageView);
|
||||
}];
|
||||
|
||||
[self updateAnchorRoomLayout];
|
||||
}
|
||||
|
||||
// 提取个播房间的布局更新逻辑,便于复用
|
||||
- (void)updateAnchorRoomLayout {
|
||||
[self.messageContainerView mas_remakeConstraints:^(MASConstraintMaker *make) {
|
||||
make.top.mas_equalTo(self.stageView.mas_bottom);
|
||||
make.bottom.mas_equalTo(self.quickMessageContainerView.mas_top).mas_offset(-5);
|
||||
make.leading.mas_equalTo(self.anchorScrollView.middleImageView);
|
||||
make.trailing.mas_equalTo(self.sideMenu.mas_leading).offset(-10);
|
||||
}];
|
||||
|
||||
|
||||
CGFloat quickMsgHeight = 30;
|
||||
//记录最后关闭时间
|
||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||
@@ -2096,22 +2152,6 @@ XPCandyTreeInsufficientBalanceViewDelegate>
|
||||
|
||||
NSLog(@"[Recv] --- Message Raw Attach Content: %@, %@, %ld", @(message.senderClientType), message.rawAttachContent, (long)message.messageType);
|
||||
|
||||
// 全服礼物/游戏飘屏按 TurboModeStateManager 的房间开关控制
|
||||
NSString *currentRoomIdForTurbo = @(self.roomInfo.roomId).stringValue;
|
||||
BOOL containsAllRoomMsg = [message.rawAttachContent containsString:@"\"allRoomMsg\":1"]; // 全服礼物飘屏标记
|
||||
BOOL containsAllGameMsg = [message.rawAttachContent containsString:@"\"allGameMsg\":1"]; // 预留:全服游戏飘屏标记
|
||||
if (containsAllRoomMsg || containsAllGameMsg) {
|
||||
BOOL allowGiftScreen = [[TurboModeStateManager sharedManager] isGlobalGiftScreenEnabledForRoom:currentRoomIdForTurbo];
|
||||
BOOL allowGameScreen = [[TurboModeStateManager sharedManager] isGlobalGameScreenEnabledForRoom:currentRoomIdForTurbo];
|
||||
if ((containsAllRoomMsg && !allowGiftScreen) || (containsAllGameMsg && !allowGameScreen)) {
|
||||
NSLog(@"[Recv] ⛔️ 按 TurboMode 屏蔽全服飘屏 | gift=%@ game=%@ | roomId=%@",
|
||||
allowGiftScreen ? @"ON" : @"OFF",
|
||||
allowGameScreen ? @"ON" : @"OFF",
|
||||
currentRoomIdForTurbo);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (message.messageType == NIMMessageTypeNotification) {
|
||||
[self handleNIMNotificationTypeMessage:message];
|
||||
} else if (message.messageType == NIMMessageTypeCustom) {
|
||||
@@ -2364,19 +2404,19 @@ XPCandyTreeInsufficientBalanceViewDelegate>
|
||||
} else if (self.roomInfo.type == RoomType_20Mic) {
|
||||
[self __layoutTwentyMicStage];
|
||||
[self changeStageViewOnRoomUpdate];
|
||||
[self.twentyMicStageView onRoomUpdate];
|
||||
// [self.twentyMicStageView onRoomUpdate];
|
||||
} else if (self.roomInfo.type == RoomType_19Mic) {
|
||||
[self __layoutNineteenMicStage];
|
||||
[self changeStageViewOnRoomUpdate];
|
||||
[self.nineteenMicStageView onRoomUpdate];
|
||||
// [self.nineteenMicStageView onRoomUpdate];
|
||||
} else if (self.roomInfo.type == RoomType_15Mic) {
|
||||
[self __layoutFifteenMicStage];
|
||||
[self changeStageViewOnRoomUpdate];
|
||||
[self.fifteenMicStageView onRoomUpdate];
|
||||
// [self.fifteenMicStageView onRoomUpdate];
|
||||
} else if (self.roomInfo.type == RoomType_10Mic) {
|
||||
[self __layoutTenMicStage];
|
||||
[self changeStageViewOnRoomUpdate];
|
||||
[self.tenMicStageView onRoomUpdate];
|
||||
// [self.tenMicStageView onRoomUpdate];
|
||||
} else {
|
||||
[self changeStageViewOnRoomUpdate];
|
||||
}
|
||||
@@ -3612,48 +3652,52 @@ XPCandyTreeInsufficientBalanceViewDelegate>
|
||||
return _functionView;
|
||||
}
|
||||
|
||||
- (StageView *)stageView {
|
||||
// 🔧 修改:如果 StageViewManager 已初始化,返回其管理的 stageView
|
||||
if (self.stageViewManager && self.stageViewManager.currentStageView) {
|
||||
return self.stageViewManager.currentStageView;
|
||||
}
|
||||
|
||||
// 🔧 降级:只有在 StageViewManager 不可用时才创建默认的 SocialStageView
|
||||
if (!_stageView) {
|
||||
_stageView = [[SocialStageView alloc] initWithDelegate:self];
|
||||
_stageView.alpha = 0;
|
||||
NSLog(@"⚠️ 使用降级 stageView: SocialStageView");
|
||||
}
|
||||
return _stageView;
|
||||
}
|
||||
//- (StageView *)stageView {
|
||||
// // 🔧 修改:如果 StageViewManager 已初始化,返回其管理的 stageView
|
||||
// if (self.stageViewManager && self.stageViewManager.currentStageView) {
|
||||
// NSLog(@"🔍 stageView getter: 返回 StageViewManager 的 currentStageView | Class: %@",
|
||||
// NSStringFromClass([self.stageViewManager.currentStageView class]));
|
||||
// return self.stageViewManager.currentStageView;
|
||||
// }
|
||||
//
|
||||
// // 🔧 降级:只有在 StageViewManager 不可用时才创建默认的 SocialStageView
|
||||
// if (!_stageView) {
|
||||
// NSLog(@"🔍 stageView getter: 创建降级 SocialStageView");
|
||||
// _stageView = [[SocialStageView alloc] initWithDelegate:self];
|
||||
// _stageView.alpha = 0;
|
||||
// NSLog(@"⚠️ stageView getter: 降级 SocialStageView 创建完成 | Class: %@",
|
||||
// NSStringFromClass([_stageView class]));
|
||||
// }
|
||||
// return _stageView;
|
||||
//}
|
||||
|
||||
- (TenMicStageView *)tenMicStageView {
|
||||
if (!_tenMicStageView) {
|
||||
_tenMicStageView = [[TenMicStageView alloc] initWithDelegate:self];
|
||||
}
|
||||
return _tenMicStageView;
|
||||
}
|
||||
|
||||
- (NineteenMicStageView *)nineteenMicStageView {
|
||||
if (!_nineteenMicStageView) {
|
||||
_nineteenMicStageView = [[NineteenMicStageView alloc] initWithDelegate:self];
|
||||
}
|
||||
return _nineteenMicStageView;
|
||||
}
|
||||
|
||||
- (TwentyMicStageView *)twentyMicStageView {
|
||||
if (!_twentyMicStageView) {
|
||||
_twentyMicStageView = [[TwentyMicStageView alloc] initWithDelegate:self];
|
||||
}
|
||||
return _twentyMicStageView;
|
||||
}
|
||||
|
||||
- (FifteenMicStageView *)fifteenMicStageView {
|
||||
if (!_fifteenMicStageView) {
|
||||
_fifteenMicStageView = [[FifteenMicStageView alloc] initWithDelegate:self];
|
||||
}
|
||||
return _fifteenMicStageView;
|
||||
}
|
||||
//- (TenMicStageView *)tenMicStageView {
|
||||
// if (!_tenMicStageView) {
|
||||
// _tenMicStageView = [[TenMicStageView alloc] initWithDelegate:self];
|
||||
// }
|
||||
// return _tenMicStageView;
|
||||
//}
|
||||
//
|
||||
//- (NineteenMicStageView *)nineteenMicStageView {
|
||||
// if (!_nineteenMicStageView) {
|
||||
// _nineteenMicStageView = [[NineteenMicStageView alloc] initWithDelegate:self];
|
||||
// }
|
||||
// return _nineteenMicStageView;
|
||||
//}
|
||||
//
|
||||
//- (TwentyMicStageView *)twentyMicStageView {
|
||||
// if (!_twentyMicStageView) {
|
||||
// _twentyMicStageView = [[TwentyMicStageView alloc] initWithDelegate:self];
|
||||
// }
|
||||
// return _twentyMicStageView;
|
||||
//}
|
||||
//
|
||||
//- (FifteenMicStageView *)fifteenMicStageView {
|
||||
// if (!_fifteenMicStageView) {
|
||||
// _fifteenMicStageView = [[FifteenMicStageView alloc] initWithDelegate:self];
|
||||
// }
|
||||
// return _fifteenMicStageView;
|
||||
//}
|
||||
|
||||
- (XPRoomLittleGameContainerView *)littleGameView {
|
||||
if (!_littleGameView) {
|
||||
@@ -3724,12 +3768,18 @@ XPCandyTreeInsufficientBalanceViewDelegate>
|
||||
NIMNotificationObject *notiMsg = (NIMNotificationObject *)message.messageObject;
|
||||
if ([notiMsg respondsToSelector:@selector(content)]) {
|
||||
NIMChatroomNotificationContent *content = (NIMChatroomNotificationContent *)notiMsg.content;
|
||||
|
||||
// 忽略离房事件
|
||||
if (content.eventType == NIMChatroomEventTypeExit || content.eventType == NIMChatroomEventTypeKicked) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ([message.rawAttachContent.lowercaseString containsString:@"allroommsg"]) {
|
||||
// 忽略与公聊房的重复事件
|
||||
NSLog(@"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
|
||||
return;
|
||||
}
|
||||
|
||||
switch (message.messageType) {
|
||||
case NIMMessageTypeNotification:
|
||||
@@ -3779,6 +3829,59 @@ XPCandyTreeInsufficientBalanceViewDelegate>
|
||||
NSLog(@" - stageView.class: %@", NSStringFromClass([self.stageView class]));
|
||||
}
|
||||
|
||||
// 检查是否有多余的 StageView 实例
|
||||
- (void)checkForDuplicateStageViews {
|
||||
NSMutableArray<StageView *> *stageViews = [NSMutableArray array];
|
||||
NSMutableArray<StageView *> *duplicateViews = [NSMutableArray array];
|
||||
|
||||
// 收集所有 StageView 实例
|
||||
NSArray *allViews = [self.view subviews];
|
||||
for (UIView *view in allViews) {
|
||||
if ([view isKindOfClass:[StageView class]]) {
|
||||
[stageViews addObject:(StageView *)view];
|
||||
}
|
||||
|
||||
// 递归检查子视图
|
||||
NSArray *subViews = [view subviews];
|
||||
for (UIView *subView in subViews) {
|
||||
if ([subView isKindOfClass:[StageView class]]) {
|
||||
[stageViews addObject:(StageView *)subView];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 检查重复实例
|
||||
if (stageViews.count > 1) {
|
||||
NSLog(@"⚠️ 检测到多个 StageView 实例 (总计: %lu 个)", (unsigned long)stageViews.count);
|
||||
for (StageView *stageView in stageViews) {
|
||||
NSLog(@" - StageView: %@ | Frame: %@ | Superview: %@",
|
||||
NSStringFromClass([stageView class]),
|
||||
NSStringFromCGRect(stageView.frame),
|
||||
NSStringFromClass([stageView.superview class]));
|
||||
}
|
||||
|
||||
// 找出当前主实例之外的重复实例
|
||||
for (StageView *stageView in stageViews) {
|
||||
if (stageView != self.stageView && stageView.superview) {
|
||||
[duplicateViews addObject:stageView];
|
||||
}
|
||||
}
|
||||
|
||||
if (duplicateViews.count > 0) {
|
||||
NSLog(@"⚠️ 发现重复的 StageView 实例,正在清理...");
|
||||
for (StageView *duplicateView in duplicateViews) {
|
||||
NSLog(@"🧹 清理重复的 StageView: %@ | Superview: %@",
|
||||
NSStringFromClass([duplicateView class]),
|
||||
NSStringFromClass([duplicateView.superview class]));
|
||||
[duplicateView removeFromSuperview];
|
||||
}
|
||||
NSLog(@"✅ 重复 StageView 实例清理完成");
|
||||
}
|
||||
} else {
|
||||
NSLog(@"✅ StageView 实例检查通过:只有 1 个实例");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// 在 StageView 上绘制符合条件的相邻麦位中点矩形
|
||||
- (void)drawSocialStageMidpointRects {
|
||||
|
@@ -77,7 +77,7 @@
|
||||
"XPSessionFindNewGreetListView0" = "Отправлено успешно";
|
||||
"XPSessionFindNewGreetListView1" = "Пожалуйста, выберите";
|
||||
"XPSessionFindNewGreetListView2" = "Изменить пакет";
|
||||
"XPSessionFindNewGreetListView3" = "Отправить";
|
||||
"XPSessionFindNewGreetListView3" = "Отпр.";
|
||||
|
||||
"XPSessionFindNewAlertView0" = "Игнорировать";
|
||||
"XPSessionFindNewAlertView1" = "Идти искать";
|
||||
@@ -157,7 +157,7 @@
|
||||
|
||||
"PKIDLoginViewController2" = "Пожалуйста, обратитесь в службу поддержки";
|
||||
"PKIDLoginViewController3" = "LINE:pekoyuyin";
|
||||
"PKIDLoginViewController4" = "Я понял";
|
||||
"PKIDLoginViewController4" = "OK";
|
||||
"MessageLevelUpgradeModel0" = "Поздравляем! Ваш уровень очарования достиг %@";
|
||||
"MessageLevelUpgradeModel1" = "Поздравляем! Ваш уровень достиг %@";
|
||||
|
||||
@@ -292,7 +292,7 @@
|
||||
"XPMonentsTooBarView8" = "Блокировать динамику";
|
||||
|
||||
"XPMonentPublishSuccessView0" = "На рассмотрении";
|
||||
"XPMonentPublishSuccessView1" = "Фух, получили вашу милую динамику~\nПосле одобрения секретарь поможет вам отправить и уведомит вас";
|
||||
"XPMonentPublishSuccessView1" = "Фух, получили вашу милую динамику~\nПосле одобрения секретарь поможет вам Отпр. и уведомит вас";
|
||||
|
||||
"XPMonentsInteractiveTableViewCell0" = "Прокомментировал вас";
|
||||
"XPMonentsInteractiveTableViewCell1" = "Пригласить";
|
||||
@@ -356,7 +356,7 @@
|
||||
|
||||
|
||||
"XPLoginInputView0" = "Получить код подтверждения";
|
||||
"XPLoginInputView1" = "Отправить снова";
|
||||
"XPLoginInputView1" = "Отпр. снова";
|
||||
|
||||
"XPLoginViewController0" = "Автоматический вход не удался, проверьте состояние мобильной сети";
|
||||
"XPLoginViewController1" = "Автоматический вход";
|
||||
@@ -407,7 +407,7 @@
|
||||
"XPLoginVerifBindPhoneViewController8" = "Код подтверждения отправлен успешно";
|
||||
"XPLoginVerifBindPhoneViewController9" = "Подтверждение прошло успешно";
|
||||
"XPLoginVerifBindPhoneViewController10" = "Повторите через %ds";
|
||||
"XPLoginVerifBindPhoneViewController11" = "Отправить снова";
|
||||
"XPLoginVerifBindPhoneViewController11" = "Отпр. снова";
|
||||
"XPLoginVerifBindPhoneViewController12" = "Страна и регион";
|
||||
"XPLoginVerifBindPhoneViewController13" = "Китай";
|
||||
"XPLoginVerifBindPhoneViewController14" = "Привязать";
|
||||
@@ -483,7 +483,7 @@
|
||||
"NSString_Utils2" = "Только что";
|
||||
"NSString_Utils3" = "%ld минут назад";
|
||||
"NSString_Utils4" = "%@0K";
|
||||
"QEmotionBoardView0" = "Отправить";
|
||||
"QEmotionBoardView0" = "Отпр.";
|
||||
"QInputBarView0" = "Удерживайте, чтобы говорить";
|
||||
"QInputBarView1" = "Отпустите, чтобы закончить";
|
||||
"QInputBarView2" = "Потяните вверх, чтобы отменить отправку";
|
||||
@@ -493,7 +493,7 @@
|
||||
"QinputPhotoView0" = "Можно выбрать до 9 изображений";
|
||||
"QinputPhotoView1" = "Альбом";
|
||||
"QinputPhotoView2" = "Оригинал";
|
||||
"QinputPhotoView3" = "Отправить";
|
||||
"QinputPhotoView3" = "Отпр.";
|
||||
|
||||
"XPAdvertiseView0" = "Пропустить";
|
||||
"XPAdvertiseView1" = "Пропустить";
|
||||
@@ -696,7 +696,7 @@
|
||||
"XPMineCollectPartyRoomViewController2" = "Еще нет сохраненных комнат";
|
||||
|
||||
"XPMinePayPwdInputView0" = "Повторите через %ld";
|
||||
"XPMinePayPwdInputView1" = "Отправить снова";
|
||||
"XPMinePayPwdInputView1" = "Отпр. снова";
|
||||
"XPMinePayPwdInputView2" = "Установить платежный пароль";
|
||||
"XPMinePayPwdInputView3" = "Введите платежный пароль еще раз";
|
||||
"XPMinePayPwdInputView4" = "Введите код подтверждения";
|
||||
@@ -709,7 +709,7 @@
|
||||
|
||||
"XPMineAccountView0" = "Баланс монет";
|
||||
|
||||
"XPMineVerifIdentityView0" = "Отправить код подтверждения";
|
||||
"XPMineVerifIdentityView0" = "Отпр. код подтверждения";
|
||||
|
||||
"AnchorLevelTimeView0" = "час(ов)";
|
||||
"AnchorLevelTimeView1" = "минут(ы)";
|
||||
@@ -993,7 +993,7 @@
|
||||
"XPMineFeedbackViewController2" = "Описание проблемы";
|
||||
"XPMineFeedbackViewController3" = "Пожалуйста, подробно опишите проблемы и ситуации, с которыми вы столкнулись. Спасибо за ваши ценные отзывы.";
|
||||
"XPMineFeedbackViewController4" = "Пожалуйста, введите ваши контактные данные";
|
||||
"XPMineFeedbackViewController5" = "Отправить отзыв";
|
||||
"XPMineFeedbackViewController5" = "Отпр. отзыв";
|
||||
|
||||
"XPMineAboutUsViewController0" = "О приложении ";
|
||||
"XPMineNotificaViewController0" = "Настройки уведомлений";
|
||||
@@ -1002,7 +1002,7 @@
|
||||
"XPMineResetLoginPwdViewController2" = "Код подтверждения отправлен успешно";
|
||||
"XPMineResetLoginPwdViewController3" = "Сброс пароля успешно выполнен, пожалуйста, войдите снова";
|
||||
"XPMineResetLoginPwdViewController4" = "Повторите через %ds";
|
||||
"XPMineResetLoginPwdViewController5" = "Отправить снова";
|
||||
"XPMineResetLoginPwdViewController5" = "Отпр. снова";
|
||||
"XPMineResetLoginPwdViewController6" = "Далее";
|
||||
"XPMineResetLoginPwdViewController7" = "Пожалуйста, введите ваш номер телефона";
|
||||
"XPMineResetLoginPwdViewController8" = "Пожалуйста, введите код подтверждения, который вы получили";
|
||||
@@ -1027,7 +1027,7 @@
|
||||
"XPMineVerifIdentityViewController2" = "Код подтверждения отправлен успешно";
|
||||
"XPMineVerifIdentityViewController3" = "Проверка прошла успешно";
|
||||
"XPMineVerifIdentityViewController4" = "Повторите через %ds";
|
||||
"XPMineVerifIdentityViewController5" = "Отправить снова";
|
||||
"XPMineVerifIdentityViewController5" = "Отпр. снова";
|
||||
"XPMineVerifIdentityViewController6" = "Далее";
|
||||
"XPMineVerifIdentityViewController7" = "Пожалуйста, введите ваш номер телефона";
|
||||
"XPMineVerifIdentityViewController8" = "Пожалуйста, введите код подтверждения, который вы получили";
|
||||
@@ -1258,7 +1258,7 @@
|
||||
"XPRoomPKTypeTableViewCell1" = "Командное PK";
|
||||
|
||||
"XPRoomPKVoteTableViewCell0" = "Тип голосования";
|
||||
"XPRoomPKVoteTableViewCell1" = "По стоимости подарков";
|
||||
"XPRoomPKVoteTableViewCell1" = "Стоим. подар.";
|
||||
"XPRoomPKVoteTableViewCell2" = "По количеству отправителей подарков";
|
||||
|
||||
"XPRoomPKRecordTableViewCell0" = "Ничья";
|
||||
@@ -1267,7 +1267,7 @@
|
||||
"XPRoomPKRecordTableViewCell3" = "Поражение";
|
||||
"XPRoomPKRecordTableViewCell4" = "Поражение";
|
||||
"XPRoomPKRecordTableViewCell5" = "Победа";
|
||||
"XPRoomPKRecordTableViewCell6" = "По стоимости подарков";
|
||||
"XPRoomPKRecordTableViewCell6" = "Стоим. подар.";
|
||||
"XPRoomPKRecordTableViewCell7" = "По количеству отправителей подарков";
|
||||
|
||||
"XPRoomPKEmptyTableViewCell0" = "Нет данных";
|
||||
@@ -1375,7 +1375,7 @@
|
||||
"XPUserCardPresenter11" = "Разблокировать";
|
||||
"XPUserCardPresenter10" = "Заблокировать микрофон";
|
||||
"XPUserCardPresenter12" = "Очистить значение подарка";
|
||||
"XPUserCardPresenter13" = "Отправить подарок";
|
||||
"XPUserCardPresenter13" = "Отпр. подарок";
|
||||
"XPUserCardPresenter14" = "Личный чат";
|
||||
"XPUserCardPresenter15" = "Подписаться";
|
||||
"XPUserCardPresenter16" = "Подписан";
|
||||
@@ -1546,7 +1546,7 @@
|
||||
"XPRoomMenuContainerView3" = "Поприветствуйте всех";
|
||||
|
||||
"XPRoomSendTextView0" = "Введите сообщение...";
|
||||
"XPRoomSendTextView1" = "Отправить";
|
||||
"XPRoomSendTextView1" = "Отпр.";
|
||||
|
||||
"DatingStageView0" = "Вы уже на микрофоне";
|
||||
"DatingStageView1" = "Чтобы выйти на микрофон, вам нужно встать в очередь";
|
||||
@@ -1839,14 +1839,14 @@
|
||||
|
||||
"XPGiftBarView0" = "Баланс: %@";
|
||||
"XPGiftBarView1" = "Пополнить";
|
||||
"XPGiftBarView2" = "Отправить";
|
||||
"XPGiftBarView2" = "Отпр.";
|
||||
"XPGiftBarView3" = "Отправка...";
|
||||
"XPGiftBarView4" = "Отправить";
|
||||
"XPGiftBarView4" = "Отпр.";
|
||||
"XPGiftBarView5" = "Пожалуйста, введите количество подарков";
|
||||
|
||||
|
||||
"XPGiftUsersView0" = "Отправить всем";
|
||||
"XPGiftUsersView1" = "Отправить всем";
|
||||
"XPGiftUsersView0" = "Отпр. всем";
|
||||
"XPGiftUsersView1" = "Отпр. всем";
|
||||
|
||||
"XPGiftHeadTypeView0" = "Бонус за первый пополнение";
|
||||
"XPGiftHeadTypeView1" = "Бонус за первый пополнение";
|
||||
@@ -1858,8 +1858,8 @@
|
||||
"XPGiftLuckyGiftBroadcastCell1" = "Открыл %@, получил ";
|
||||
"XPGiftLuckyGiftBroadcastView0" = "Правила игры";
|
||||
|
||||
"XPSendGiftView0" = "Можно отправить всем только одному человеку";
|
||||
"XPSendGiftView1" = "Можно отправить всем только одному человеку";
|
||||
"XPSendGiftView0" = "Можно Отпр. всем только одному человеку";
|
||||
"XPSendGiftView1" = "Можно Отпр. всем только одному человеку";
|
||||
"XPSendGiftView2" = "Пожалуйста, выберите хотя бы одного человека";
|
||||
"XPSendGiftView3" = "Успешно отправлен граффити-подарок: %@";
|
||||
"XPSendGiftView4" = "Еще не достигнут уровень VIP, необходимый для отправки %@\nТребуемый уровень VIP: %@";
|
||||
@@ -2026,7 +2026,7 @@
|
||||
"XPReceiveRedPacketView4" = "Забрано %@/%@";
|
||||
"XPReceiveRedPacketView5" = "Все взяли, приходите раньше в следующий раз";
|
||||
"XPReceiveRedPacketView6" = "Открывается через";
|
||||
"XPReceiveRedPacketView7" = "Отправить Данмаки\nХватить красный пакет";
|
||||
"XPReceiveRedPacketView7" = "Отпр. Данмаки\nХватить красный пакет";
|
||||
"XPReceiveRedPacketView8" = "-ов красный пакет";
|
||||
"XPReceiveRedPacketView9" = "Быстрее приходите, чтобы хватить красный пакет, кто первый тот и забрал!";
|
||||
"XPReceiveRedPacketView10" = "Подпишитесь на ведущего, чтобы хватить красные пакеты!";
|
||||
@@ -2034,7 +2034,7 @@
|
||||
"XPReceiveRedPacketView12" = "Отправьте Данмаки %@, чтобы хватить красные пакеты!";
|
||||
"XPReceiveRedPacketView13" = "Подписаться на ведущего\nХватить красный пакет";
|
||||
"XPReceiveRedPacketView14" = "Поделиться комнатой\nХватить красный пакет";
|
||||
"XPReceiveRedPacketView15" = "Отправить Данмаки\nХватить красный пакет";
|
||||
"XPReceiveRedPacketView15" = "Отпр. Данмаки\nХватить красный пакет";
|
||||
"XPReceiveRedPacketView16" = "Не участвую\nв мероприятии";
|
||||
"XPReceiveRedPacketView17" = "Условия выполнены, хватайте красные пакеты сейчас";
|
||||
"XPReceiveRedPacketView18" = "Не участвуете в мероприятии, не можете хватить этот красный пакет";
|
||||
@@ -2102,18 +2102,18 @@
|
||||
"XPRoomLotteryPrizeView16" = "Поздравляем с выигрышем приза!";
|
||||
"XPRoomLotteryPrizeView17" = "Извините, фонд призов пуст!";
|
||||
|
||||
"XPRoomSendGiftViewController0" = "Отправить %@";
|
||||
"XPRoomSendGiftViewController0" = "Отпр. %@";
|
||||
"XPRoomSendGiftViewController1" = "Получено %@ от %@";
|
||||
"XPRoomSendGiftViewController2" = "Получено %@ от %@";
|
||||
"XPRoomSendGiftViewController3" = "Получен красный пакет";
|
||||
"XPRoomSendGiftViewController4" = "Отправить";
|
||||
"XPRoomSendGiftViewController4" = "Отпр.";
|
||||
|
||||
"XPRoomMessageView0" = "Комната включена и готова к приему сообщений";
|
||||
"XPRoomMessageView1" = "Введите текст для отправки";
|
||||
"XPRoomMessageView2" = "Комната заглушена, невозможно отправить сообщения";
|
||||
"XPRoomMessageView3" = "Комната заблокирована, невозможно отправить сообщения";
|
||||
"XPRoomMessageView2" = "Комната заглушена, невозможно Отпр. сообщения";
|
||||
"XPRoomMessageView3" = "Комната заблокирована, невозможно Отпр. сообщения";
|
||||
"XPRoomMessageView4" = "Вам запрещено отправлять сообщения в этой комнате";
|
||||
"XPRoomMessageView5" = "Вы были заглушены, невозможно отправить сообщения";
|
||||
"XPRoomMessageView5" = "Вы были заглушены, невозможно Отпр. сообщения";
|
||||
"XPRoomMessageView6" = "Подарков пока не получено";
|
||||
|
||||
"XPRoomEnterTimeView0" = "Войти в комнату";
|
||||
@@ -2123,7 +2123,7 @@
|
||||
"XPRoomReceiveGiftView2" = "Получен красный пакет от";
|
||||
|
||||
"XPRoomSendRedPacketView0" = "Открыть красный пакет";
|
||||
"XPRoomSendRedPacketView1" = "Отправить красный пакет";
|
||||
"XPRoomSendRedPacketView1" = "Отпр. красный пакет";
|
||||
"XPRoomSendRedPacketView2" = "Примечание к красному пакету";
|
||||
"XPRoomSendRedPacketView3" = "Количество красных пакетов";
|
||||
"XPRoomSendRedPacketView4" = "Общее количество алмазов";
|
||||
@@ -2277,7 +2277,7 @@
|
||||
|
||||
|
||||
"XPLoginInputView0" = "Получить код подтверждения";
|
||||
"XPLoginInputView1" = "Отправить повторно";
|
||||
"XPLoginInputView1" = "Отпр. повторно";
|
||||
|
||||
"XPLoginViewController0" = "Авторизация одним кликом не удалась. Проверьте состояние мобильной сети";
|
||||
"XPLoginViewController1" = "Авторизация одним кликом";
|
||||
@@ -2417,7 +2417,7 @@
|
||||
"XPFeedBackViewController2" = "Введите содержание обратной связи";
|
||||
"XPFeedBackViewController3" = "Контактная информация";
|
||||
"XPFeedBackViewController4" = "Введите вашу контактную информацию";
|
||||
"XPFeedBackViewController5" = "Отправить";
|
||||
"XPFeedBackViewController5" = "Отпр.";
|
||||
"XPFeedBackViewController6" = "Введите тип обратной связи";
|
||||
|
||||
|
||||
@@ -2517,7 +2517,7 @@
|
||||
"LoginVerifCodeViewController1" = "Вход выполнен успешно";
|
||||
"LoginVerifCodeViewController2" = "Код подтверждения отправлен на";
|
||||
"LoginVerifCodeViewController3" = "Введите код подтверждения";
|
||||
"LoginVerifCodeViewController4" = "Отправить код подтверждения повторно";
|
||||
"LoginVerifCodeViewController4" = "Отпр. код подтверждения повторно";
|
||||
|
||||
"UserPrivacyView0" = "Политика конфиденциальности “%@”";
|
||||
"UserPrivacyView1" = "Добро пожаловать в %@. Мы поможем вам понять сбор, использование, хранение и обмен личной информацией с помощью “Политики конфиденциальности” и “Пользовательского соглашения”, особенно соответствие между типами и целями сбора личной информации.\n\nДля обеспечения нормальной работы продукта мы можем собирать от вас некоторую необходимую информацию. Мы можем собирать личные чувствительные данные, такие как контактная информация, и у вас есть право отказаться от предоставления нам этой информации. Мы не будем делиться, предоставлять, передавать или получать вашу личную информацию от третьих лиц без вашего согласия.";
|
||||
@@ -2561,7 +2561,7 @@
|
||||
|
||||
"PKIDLoginViewController11" = "SMS отправлено успешно";
|
||||
"LoginVerifCodeViewController3" = "Код подтверждения";
|
||||
"LoginVerifCodeViewController4" = "Отправить повторно";
|
||||
"LoginVerifCodeViewController4" = "Отпр. повторно";
|
||||
|
||||
"XPLoginViewController11" = "Прежде чем зарегистрироваться и войти в систему, вам нужно согласиться с политикой конфиденциальности и пользовательским соглашением~";
|
||||
|
||||
@@ -2578,9 +2578,9 @@
|
||||
///XPMineGuildListCell
|
||||
"XPMineGuildListCell0" = "Подать заявку на вступление";
|
||||
"XPMineGuildListCell1" = "Заявка подана";
|
||||
"XPMineGuildListCell2" = "Нельзя отправить повторную заявку в течение 3 дней";
|
||||
"XPMineGuildListCell2" = "Нельзя Отпр. повторную заявку в течение 3 дней";
|
||||
"XPMineGuildListCell3" = "ID комнаты: %ld";
|
||||
"XPMineGuildListCell4" = "Нельзя отправить повторную заявку в течение 7 дней";
|
||||
"XPMineGuildListCell4" = "Нельзя Отпр. повторную заявку в течение 7 дней";
|
||||
"XPMineGuildListCell5" = "На рассмотрении";
|
||||
"XPMineGuildListCell6" = "Приглашено";
|
||||
|
||||
@@ -3077,7 +3077,7 @@
|
||||
"LoginForgetPasswordViewController3" = "%ds до повторной попытки";
|
||||
"LoginForgetPasswordViewController4" = "Повторить отправку";
|
||||
"LoginForgetPasswordViewController5" = "Пожалуйста, введите правильный номер телефона";
|
||||
"LoginForgetPasswordViewController6" = "Отправить";
|
||||
"LoginForgetPasswordViewController6" = "Отпр.";
|
||||
"LoginForgetPasswordViewController7" = "Пожалуйста, введите номер телефона";
|
||||
"LoginForgetPasswordViewController8" = "код подтверждения";
|
||||
"LoginForgetPasswordViewController9" = "Пожалуйста, введите пароль (6-16 символов)";
|
||||
@@ -3149,9 +3149,9 @@
|
||||
"XPTreasureFairyFriendView1"="Поиск друзей";
|
||||
|
||||
"XPTreasureFairyMessageSendView0"="Отправлено успешно";
|
||||
"XPTreasureFairyMessageSendView1"="Вы уверены, что хотите отправить 1 карту феи '%@' для \"%@\"?";
|
||||
"XPTreasureFairyMessageSendView1"="Вы уверены, что хотите Отпр. 1 карту феи '%@' для \"%@\"?";
|
||||
"XPTreasureFairyMessageSendView2"="Закрыть";
|
||||
"XPTreasureFairyMessageSendView3"="Отправить";
|
||||
"XPTreasureFairyMessageSendView3"="Отпр.";
|
||||
|
||||
"XPTreasureFairyMoreView0"="Пояснение к правилам";
|
||||
"XPTreasureFairyMoreView1"="Хранитель сокровищ";
|
||||
@@ -3169,9 +3169,9 @@
|
||||
|
||||
"XPTreasureFairySendView0"="Отправлено успешно";
|
||||
"XPTreasureFairySendView1"="Отправлен запрос другу";
|
||||
"XPTreasureFairySendView2"="Вы уверены, что хотите отправить 1 карту феи '%@' для \"%@\"?";
|
||||
"XPTreasureFairySendView2"="Вы уверены, что хотите Отпр. 1 карту феи '%@' для \"%@\"?";
|
||||
"XPTreasureFairySendView3"="Вы уверены, что хотите запросить 1 карту феи '%@' у \"%@\"?";
|
||||
"XPTreasureFairySendView4"="Отправить";
|
||||
"XPTreasureFairySendView4"="Отпр.";
|
||||
"XPTreasureFairySendView5"="Запрос";
|
||||
"XPTreasureFairySendView6"="Закрыть";
|
||||
|
||||
@@ -3460,7 +3460,7 @@
|
||||
"PIRoomPhotoAlbumItemVC2"="Пожалуйста, выберите фотографии комнаты для загрузки";
|
||||
"PIRoomPhotoAlbumItemVC3"="Загрузка успешна";
|
||||
"PIRoomPhotoAlbumItemVC4"="Вы уверены, что хотите удалить эту фотографию?";
|
||||
"PIRoomPhotoAlbumItemVC5"="Вы уверены, что хотите отправить эту фотографию на публичный экран?";
|
||||
"PIRoomPhotoAlbumItemVC5"="Вы уверены, что хотите Отпр. эту фотографию на публичный экран?";
|
||||
///PIRoomPhotoAlbumChoosePhotoCell
|
||||
"PIRoomPhotoAlbumChoosePhotoCell0"="Максимум 6 фотографий за одну загрузку";
|
||||
///PIRoomPhotoAlbumChoosePhotoTypeView
|
||||
@@ -3483,7 +3483,7 @@
|
||||
"PIRoomMessageUnlockPhotoAlbumView0"="Подарок для разблокировки фотографии";
|
||||
"PIRoomMessageUnlockPhotoAlbumView1"="Разблокировать сейчас";
|
||||
///PIRoomPhotoAlbumOperateView
|
||||
"PIRoomPhotoAlbumOperateView0"="Отправить на публичный экран";
|
||||
"PIRoomPhotoAlbumOperateView0"="Отпр. на публичный экран";
|
||||
"PIRoomPhotoAlbumOperateView1"="Удалить фотографию";
|
||||
"PIRoomPhotoAlbumOperateView2"="Просмотреть крупное изображение";
|
||||
///XPMaskManagerVC
|
||||
@@ -3550,7 +3550,7 @@
|
||||
"App_Commont_Week" = "Неделя";
|
||||
"App_Commont_Month" = "Месяц";
|
||||
"App_Commont_Hour" = "Час";
|
||||
"App_Commont_Minute" = "Минута";
|
||||
"App_Commont_Minute" = "мин.";
|
||||
"App_Commont_Day" = "День";
|
||||
"App_Common_To" = "В";
|
||||
"App_Common_Number" = "Номер";
|
||||
@@ -3674,10 +3674,10 @@
|
||||
"VipCenter_6" = "Истекает: %@";
|
||||
"VipCenter_7" = "VIP%ld доступен только по акции";
|
||||
|
||||
"Combo_0" = "Отправить";
|
||||
"Combo_0" = "Отпр.";
|
||||
"Combo_1" = "Все микрофоны";
|
||||
"Combo_2" = "Многопользовательский";
|
||||
"Combo_3" = "Отправить %@";
|
||||
"Combo_3" = "Отпр. %@";
|
||||
"Combo_4" = "Выиграть";
|
||||
"Combo_5" = "Монеты";
|
||||
"Combo_6" = "Поздравляем!";
|
||||
@@ -3757,7 +3757,7 @@
|
||||
"1.0.18_12" = "Вы уверены, что хотите использовать это изображение в качестве вашего фона?";
|
||||
"1.0.18_13" = "Вы уверены, что хотите купить?";
|
||||
"1.0.18_14" = "1000/15Дней";
|
||||
"1.0.18_15" = "Отправить";
|
||||
"1.0.18_15" = "Отпр.";
|
||||
"1.0.18_16" = "Подтвердить";
|
||||
"1.0.18_17" = "Оригинальный";
|
||||
"1.0.18_18" = "На рассмотрении";
|
||||
@@ -3854,18 +3854,18 @@
|
||||
"1.0.37_text_3" = "Выбрать подарок";
|
||||
"1.0.37_text_4" = "Числа удачного мешка";
|
||||
"1.0.37_text_5" = "Время ожидания";
|
||||
"1.0.37_text_6" = "Отправить подарочный удачный мешок";
|
||||
"1.0.37_text_6" = "Отпр. подарочный удачный мешок";
|
||||
"1.0.37_text_7" = "%@Мин";
|
||||
"1.0.37_text_8" = "Числа удачного мешка";
|
||||
"1.0.37_text_9" = "Всего потрачено %@ монет";
|
||||
"1.0.37_text_10" = "Подарок";
|
||||
"1.0.37_text_11" = "Отправить %@ подарков, потратить %@ монет";
|
||||
"1.0.37_text_11" = "Отпр. %@ подарков, потратить %@ монет";
|
||||
"1.0.37_text_12" = "Изменить ";
|
||||
"1.0.37_text_13" = "Время ожидания %@ минут";
|
||||
"1.0.37_text_14" = "Полученный удачный мешок";
|
||||
"1.0.37_text_15" = "Отправленный удачный мешок";
|
||||
"1.0.37_text_15.1" = "Отправить подарочный удачный мешок";
|
||||
"1.0.37_text_15.2" = "Отправить мешок удачи с монетами";
|
||||
"1.0.37_text_15.1" = "Отпр. подарочный удачный мешок";
|
||||
"1.0.37_text_15.2" = "Отпр. мешок удачи с монетами";
|
||||
"1.0.37_text_17.1" = "Подарочный удачный мешок %@!";
|
||||
"1.0.37_text_17.2" = "Мешок удачи с монетами %@!";
|
||||
"1.0.37_text_18" = "Скоро";
|
||||
@@ -4019,7 +4019,7 @@
|
||||
"20.20.62_text_5" = "Пользователь ушел, приглашение не удалось.";
|
||||
"20.20.62_text_6" = "Микрофон занят. Пожалуйста, попробуйте позже.";
|
||||
"20.20.62_text_7" = "У вас нет разрешения приглашать пользователя на микрофон.";
|
||||
"20.20.62_text_8" = "Не удалось отправить приглашение. Пожалуйста, проверьте сеть.";
|
||||
"20.20.62_text_8" = "Не удалось Отпр. приглашение. Пожалуйста, проверьте сеть.";
|
||||
|
||||
|
||||
"20.20.62_text_9" = "Включение/выключение эффектов";
|
||||
|
Reference in New Issue
Block a user