gpt4 book ai didi

iphone - 如何为本地化应用程序加载 XIB?

转载 作者:行者123 更新时间:2023-12-03 18:41:55 25 4
gpt4 key购买 nike

我发现在模拟器上成功运行和调试本地化应用程序几天后,它(或 XCode 部署过程)进入了一种状态,如果模拟器设置为我支持的本地语言之一,它就会崩溃启动时使用以下堆栈:

3   CoreFoundation                      0x01780e6a +[NSException raise:format:] + 58
4 UIKit 0x008050fa -[UINib instantiateWithOwner:options:] + 2024
5 UIKit 0x00806ab7 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 168
6 UIKit 0x0060c17a -[UIApplication _loadMainNibFile] + 172
7 UIKit 0x0060ccf4 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] +
8 UIKit 0x00617617 -[UIApplication handleEvent:withNewEvent:] + 1533
9 UIKit 0x0060fabf -[UIApplication sendEvent:] + 71
10 UIKit 0x00614f2e _UIApplicationHandleEvent + 7576
11 GraphicsServices 0x01e13992 PurpleEventCallback + 1550

发生崩溃是因为 UIApplication 无法加载 MainWindow.nib 文件:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle /.app> (loaded)' with name 'MainWindow''

当您本地化应用程序时,您有几个选择。您可以执行以下一项(或两项)操作:

  • 根据设备上的语言本地化加载的每个 Xib 文件。因此,您的本地化 UI 完全是通过 Interface Builder 配置的。
  • 您可以为每种语言目标设置一个 Localized.strings 文件,并从代码访问其中的字符串。

我选择了后者,因为我希望所有本地化字符串都放在一个位置(这样就可以一次全部翻译)。这意味着我的项目中的语言特定目录中没有任何 xib 文件(fr.lproj、zh-Hant.lproj 等...)。相反,我有 en.lproj 充满了我的所有 xib 文件(构建后的 nib 文件)和包含相应翻译的 Localized.strings 文件的语言特定目录。

正如我所提到的,这几天一直运行良好。今天(我不确定具体在什么时候),模拟器上的应用程序在启动时开始崩溃。在设备上安装应用程序运行良好,并在模拟器上以英语模式运行应用程序运行良好。

经过大量的填充后,我意识到模拟器崩溃了,因为它正在语言特定的目录中寻找它的 nib 文件(fr.lpro、sz-Hant.lproj、ja.lproj,具体取决于语言设置) )。

因此,模拟器在无法在语言特定目录中找到 Nib 后,似乎处于不查找默认语言目录 (en.lproj) 的状态。

我通过进入模拟器的应用程序目录解决了这个问题(基于上面的异常消息):

/Users/.../Library/Application Support/iPhone Simulator/4.3/Applications//.app

然后进入特定于语言的子目录并将所有 nib 文件从 en.lproj 复制到该目录中。

手动复制文件后,模拟器会加载特定于语言的 nib 文件(实际上只是 en.lproj 目录中文件的副本),并且一切正常。

所以我的问题:

  • 这只是模拟器中的一个错误吗? 对此坚决反对
  • 还有其他人遇到过这个问题吗? 是的
  • 这是我不小心切换了一些晦涩的 XCode 设置的结果吗? 不,看起来不像

更新

今天发现这个问题不仅仅局限于模拟器,设备上也会出现这种情况。因此,我上面描述的解决方法(将 Nib 从默认语言目录复制到目标语言目录)显然在手机上不起作用。

我尝试了 McCygnus 建议的修复(删除我的 xib 的所有本地化,这会将它们移回根目录)并为我排序。所以我猜本地化系统会检查当前的语言目录,然后检查根目录,它不会回退到您的默认语言。

最佳答案

我最近遇到了这个问题,当时我有英文版的 Nib ,但没有将其本地化为任何其他语言(MyNib 在 en.lproj 中)。模拟器仅在其他语言目录(da.lproj、de.lproj 等)中查找 MyNib,如果找不到,则不会回退到英语版本。我通过删除 Nib 的英语本地化来修复它。这导致它与其他资源一起位于应用程序包的根目录中,而不是位于 en.lproj 中。之后一切都很顺利。

我对此有点困惑,因为我认为本地化系统会按照用户的首选顺序检查所有语言,而开发人员通常使用英语作为包罗万象的语言。我不确定这是否是加载行为的变化或模拟器错误(我从未在设备上尝试过)。我猜是后者,但我不确定。这提醒我我需要提交一份错误报告。

关于iphone - 如何为本地化应用程序加载 XIB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5988589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com