如何在Xcode中为同一Storyboard给不同Target配置不同Storyboard.strings?
用本地化+Target专属Strings文件实现白标文本定制
这方案选得太明智了!相比写一堆IBOutlet和if-else逻辑,用本地化来处理不同Target的文本差异,不仅代码更干净,后续维护也方便太多。我来一步步带你实现:
步骤1:给Main.storyboard开启本地化
- 选中项目里的
Main.storyboard,打开右侧的File Inspector(最右边的面板); - 找到
Localization区域,点击Localize...按钮; - 在弹出的窗口里选择你的默认语言(比如English),点击
Localize确认。这时候项目里会生成一个Main.strings文件,对应你选的语言。
步骤2:为每个Target创建专属的Strings文件
默认的Main.strings是所有Target共享的,我们需要为每个白标Target单独创建专属文件:
- 右键项目目录 →
New File...→ 选择Strings File,命名为Main-TargetA.strings(对应你的Target A); - 选中刚创建的
Main-TargetA.strings,在右侧File Inspector的Target Membership里,只勾选Target A,取消其他Target的勾选; - 重复上面的操作,为Target B创建
Main-TargetB.strings,并只勾选Target B的成员资格。
步骤3:提取Storyboard文本到对应Strings文件
接下来要把Main.storyboard里的硬编码文本映射到每个Target的Strings文件中,有两种简单方法获取对应的key:
方法A:直接导出Storyboard的本地化字符串
- 打开
Main.storyboard,右键空白处 → 选择Show Localization Strings; - 弹出的窗口里会列出所有可本地化的UI元素文本,格式是
"[ObjectID].[属性名]" = "原文本";,比如"fVq-3K-abc.text" = "Welcome";; - 把这些键值对复制到对应Target的Strings文件里,修改后面的value即可,比如Target A里改成
"fVq-3K-abc.text" = "Welcome to A";,Target B里改成"fVq-3K-abc.text" = "Welcome to B";。
方法B:手动获取Object ID
- 在Main.storyboard里选中需要修改文本的UI组件(比如UILabel);
- 打开右侧的Identity Inspector,找到
Object ID字段,复制这个ID; - 在Target的Strings文件里手动写键值对,格式是
"[ObjectID].text" = "自定义文本";(如果是按钮的标题就是"[ObjectID].title")。
步骤4:配置Target加载专属Strings文件
现在要让每个Target在运行时加载自己的Strings文件:
- 选中对应的Target(比如Target A),打开
Build Settings; - 搜索
Copy Bundle Resources,确保里面只包含Main-TargetA.strings,如果原来的Main.strings还在列表里,可以把它移除(或者保留作为 fallback,看你的需求); - 另外,在Target的
Info.plist里,确保CFBundleLocalizations数组包含你使用的语言(比如en),这样系统才能正确识别本地化文件。
步骤5:测试验证
分别运行不同的Target,检查对应的UI文本是否已经变成你定制的内容。如果没生效,可以检查:
- Strings文件的语法是否正确(键值对必须用双引号,结尾加分号,不能有语法错误);
- Target Membership是否只勾选了对应的Target;
- Build Settings里的Copy Bundle Resources是否包含了正确的Strings文件。
额外注意事项
- 后续如果在Main.storyboard里新增了UI组件,记得把对应的本地化键值对添加到所有Target的Strings文件里;
- 如果需要支持多语言(比如英文+中文),可以给每个Target的Strings文件再添加本地化语言版本,操作和第一步类似,选中Strings文件后在Localization区域添加新语言即可。
内容的提问来源于stack exchange,提问作者Sandeep Bhandari
相关产品推荐
相关产品推荐

