UIActivityViewController的Edit Actions显示为SHARE_SHEET_EDIT_ACTIONS_BUTTON_TITLE问题
UIActivityViewController 底部Edit Actions按钮标题显示异常问题
问题描述
我遇到一个UIActivityViewController相关的异常问题:其底部Edit Actions按钮的标题显示错误,本该展示Edit Actions..,实际却显示为SHARE_SHEET_EDIT_ACTIONS_BUTTON_TITLE。
已排查情况
- WhatsApp、Instagram等其他第三方应用的该功能表现正常
- 完全相同的代码在新建的iOS项目中运行无异常
- 已使用Xcode 13.1版本在iOS 15.0、iOS 14.0及以上系统版本测试
- 真机和模拟器均完成测试,问题可稳定复现
补充说明
当前出现问题的项目是3年前创建的Objective-C项目。
相关实现代码
NSString* shareText = @"Sharing an eddress with you"; NSURL *website = [NSURL URLWithString:@"http://eddress.co/EDDRSS"]; NSArray *shareArray = @[shareText, website]; UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:shareArray applicationActivities:nil]; [activityVC setValue:@"Someone shared an eddress with you" forKey:@"subject"]; NSArray *excludeActivities = @[UIActivityTypeAirDrop, UIActivityTypePrint, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAddToReadingList, UIActivityTypePostToFlickr, UIActivityTypePostToVimeo]; activityVC.excludedActivityTypes = excludeActivities; [self presentViewController:activityVC animated:YES completion:nil];
相关截图


问题根因
这个问题是系统本地化字符串查找被拦截导致的:SHARE_SHEET_EDIT_ACTIONS_BUTTON_TITLE是UIKit框架内的本地化key,系统默认会自动将其转换为对应语言的按钮标题,当项目存在自定义全局本地化逻辑时,会优先查找项目内的本地化表,找不到就直接返回了key本身。
常见触发场景有三个:
- 老项目全局重写了
NSLocalizedString宏,替换为自定义的本地化实现,没有兼容系统框架的本地化查找逻辑 - Info.plist中
CFBundleAllowMixedLocalizations配置为NO,导致无法加载系统框架的本地化资源 - 引入的第三方库修改了全局本地化逻辑,或者存在同名key的错误资源
解决方案
方案1:修复自定义本地化逻辑(最推荐)
全局搜索项目中是否有重写NSLocalizedString的宏定义,通常格式如下:
#define NSLocalizedString(key, comment) CustomLocalizedString(key, comment)
修改对应的自定义本地化方法,增加系统框架 fallback 逻辑:
NSString *CustomLocalizedString(NSString *key, NSString *comment) { // 先查找项目内的本地化资源 NSString *localizedValue = [[NSBundle mainBundle] localizedStringForKey:key value:nil table:nil]; // 项目内找不到对应key,回退到UIKit框架的本地化资源查找 if ([localizedValue isEqualToString:key]) { NSBundle *uiKitBundle = [NSBundle bundleForClass:[UIActivityViewController class]]; localizedValue = [uiKitBundle localizedStringForKey:key value:key table:nil]; } return localizedValue; }
方案2:修正Info.plist配置
在Info.plist中添加CFBundleAllowMixedLocalizations字段,值设为YES,允许应用加载系统框架的本地化资源,不受项目本身本地化语言列表限制。
方案3:临时兜底修复
如果无法快速定位根因,可以通过运行时遍历视图的方式强制修改按钮标题,在弹出分享页的completion回调中执行即可:
[self presentViewController:activityVC animated:YES completion:^{ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self fixEditButtonTitleInView:activityVC.view]; }); }]; // 遍历查找按钮并修改标题 - (void)fixEditButtonTitleInView:(UIView *)parentView { for (UIView *subview in parentView.subviews) { if ([subview isKindOfClass:[UIButton class]]) { UIButton *button = (UIButton *)subview; if ([button.titleLabel.text isEqualToString:@"SHARE_SHEET_EDIT_ACTIONS_BUTTON_TITLE"]) { [button setTitle:@"Edit Actions..." forState:UIControlStateNormal]; return; } } [self fixEditButtonTitleInView:subview]; } }
内容的提问来源于stack exchange,提问作者Shamsudheen TK
相关产品推荐
相关产品推荐

