Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何为本地化应用加载XIB?_Iphone_Localization_Ios Simulator - Fatal编程技术网

Iphone 如何为本地化应用加载XIB?

Iphone 如何为本地化应用加载XIB?,iphone,localization,ios-simulator,Iphone,Localization,Ios Simulator,我发现,在模拟器上成功运行和调试本地化应用程序几天后,它(或XCode部署过程)进入一种状态,如果模拟器设置为我支持的本地语言之一,它将在启动时崩溃,堆栈如下: 3 CoreFoundation 0x01780e6a +[NSException raise:format:] + 58 4 UIKit 0x008050fa -[UINib instantiateWithOwner:opti

我发现,在模拟器上成功运行和调试本地化应用程序几天后,它(或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
发生崩溃是因为UIWindow应用程序无法加载MainWindow.nib文件:

由于未捕获而终止应用程序 例外 “NSInternalInconsistencyException”, 原因:“无法在捆绑包中加载NIB: “NSBundle /.app> (已加载)“名称为”主窗口“

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

  • 根据设备上的语言本地化加载的每个Xib文件。因此,您的本地化UI完全是从Interface Builder配置的
  • 您可以为每个语言目标设置Localizable.strings文件,并从代码中访问其中的字符串
我选择后者是因为我希望所有本地化字符串都放在一个地方(这样就可以一次翻译所有字符串)。这意味着我的项目中特定于语言的目录中没有任何xib文件(fr.lproj、zh-Hant.lproj等)。相反,我的en.lproj中充满了我的所有xib文件(一旦构建了nib文件),以及包含相应翻译的本地化.strings文件的特定于语言的目录

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

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

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

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

/用户/../Library/应用程序 支持/iPhone 模拟器/4.3/Applications//.app

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

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

所以我的问题是:

  • 这只是模拟器中的一个bug吗所以对这一点有很大的反对意见
  • 还有其他人有这个问题吗
  • 这是因为我不小心切换了一些模糊的XCode设置吗不,看起来不像
更新

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


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

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


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

有相同的症状,但不同的根本原因,我想与大家分享。正如McCygnus暗示的那样,我取消了本地化(谢谢),但仍然只有iPad例外。事实证明,我的Info.plist文件包含一个指向特定于iPad的主窗口nib文件(MainWindow iPad.nib)的链接。去掉这个之后,一切都正常了

如果您正在使用

[[Class alloc] initWithNibName:@"aNibName" bundle:nil];  
换成

[[Class alloc] initWithNibName:@"aNibName" bundle:[NSBundle mainBundle]];

我只需重新启动xcode就可以解决这个问题=/

这听起来像是同一个问题。我想我们中的一个或两个应该把它记录下来:)我也有这个问题。它可以在模拟器和设备上复制。我只看到一个困难的解决方案——将相同的.xib文件添加到每个.lproj文件夹。这在逻辑上似乎不正确,但我找不到其他解决办法。有什么想法吗?@berec所以你想确定你所有的xib都在根目录中。如果它们不在特定语言的目录中,你可以在en.lproj中找到它们。我现在很生气,我花了两个小时查找这个问题,最后一个简单的关闭xcode并重新进入就成功了!天哪!我逐渐了解到,在5分钟后,无论出现什么类型或奇怪的问题,重启xcode几乎总是值得一试的。它的工作频率太高了。