iOS 8.1模拟器始终使用美国键盘布局,尽管德国硬件键盘。

54
由于某些原因,我无法再使用我的德语键盘将文本输入到iOS模拟器中了。在下载Xcode 6.1(包含iOS 8.1)后,我被困在美式布局中。我尝试了更改所有硬件/键盘设置、删除~/Library/Preferences/com.apple.iphonesimulator.plist和重置iOS模拟器等方法,但都没有帮助!我应该重新安装整个软件包吗?

1
我会启用:硬件->键盘->切换软键盘并更改软键盘的语言环境,然后我就可以在我的硬件键盘上输入了。 - Horst
8个回答

46
这是iOS 8.1模拟器运行时的已知问题,并在Xcode 6.1发布说明中提到:

本地化和键盘设置(包括第三方键盘)在iOS 8.1模拟器中未被Safari、Maps和开发者应用程序正确识别。[NSLocale currentLocale]返回en_US,只提供英语和表情符号键盘。(18418630, 18512161)

其他应该影响所有应用而不仅仅是地区设置的偏好也同样如此,例如:键盘设置。
正如在iOS SDK 8.2 beta 2发布说明中提到的那样,这个问题应该在iOS 8.2中得到解决:

beta 2版中已修复了这个问题。Safari、Maps或第三方应用程序中可能不会出现其他键盘,包括第三方键盘。

如果您需要使用iOS 8.1,则某些应用程序可以使用德语布局,而其他应用程序则无法使用,例如:Safari和Maps。

抱歉,我不完全理解你的意思:“如果您想通过重复提交错误报告来“投票”支持该错误,请提交其他雷达。” 我没有遇到其他程序(如Safari或Maps)的任何问题! - pawi
我想说的是,虽然这已经是一个已知问题,但你应该在http://bugreport.apple.com上提交自己的雷达。 - Jeremy Huddleston Sequoia
如果这是一个已知问题,是否每个人都遇到了这个问题?我在其他地方找不到任何关于此的投诉! - pawi
2
这个 NSLocale 的问题是否也导致 [[NSLocale preferredLanguages] objectAtIndex:0] 总是返回 "en"?这似乎类似于我遇到的问题,@JeremyHuddlestonSequoia 能否帮我看一下?谢谢!https://dev59.com/al8d5IYBdhLWcg3wpzr4 - S1U
1
是的。根本问题在于8.1模拟器中全局偏好设置无法正常工作。键盘设置和本地化是这些偏好设置中最明显的。我会努力更新发布说明以获得更好的清晰度。 - Jeremy Huddleston Sequoia
显示剩余7条评论

37

这是iOS 8.1模拟器的漏洞。

我可以通过设置已使用方案中的“应用程序语言”来测试语言。

前往“产品” > “方案” > “编辑方案...”或按下cmd + Y。

来源:Yoshihiro Sakamoto在苹果开发论坛上的回答

输入图像描述


太好了! 这解决了我的问题! 我明确将应用程序语言设置为“德语”,然后,模拟器就接受我的德语键盘了! 非常感谢! - pawi
9
为什么我的“应用程序语言”只能选择“英语”和“系统语言”,而不能选择我想要的国家?即使我已经更改了我想设置的模拟器语言。 - William Hu
这帮助我节省了很多测试时间,非常感谢。 - Will
1
你怎么找到那个屏幕的?好像无论在哪里都找不到它? - Kevin Simper
我不得不同时做这两件事情,并且改变模拟器系统语言。 - dulgan
在 Xcode 9.4.1 中将应用程序语言设置为英语时,此操作无法正常工作。 - Julius

14

在苹果公司修复之前,可以使用基于NSLocale swizzling的以下经过检查的解决方案。

实际上,我们只需要替换错误的currentLocale,因为在iOS8.1模拟器中它已经损坏了。

将此类别附加到项目并将其添加到.pch文件中(不要忘记清除并重建项目)。

//  NSLocale+ios8.h
//  Created by Alexey Matveev on 01.11.2014.
//  Copyright (c) 2014 Alexey Matveev. All rights reserved.

#if TARGET_IPHONE_SIMULATOR

// define here your locale identifier: de_DE, ru_RU, etc
#define LOCALE_IDENTIFIER @"de_DE"

@interface NSLocale (iOS8)
@end

#endif

//  NSLocale+ios8.m
//  Created by Alexey Matveev on 01.11.2014.
//  Copyright (c) 2014 Alexey Matveev. All rights reserved.

#if TARGET_IPHONE_SIMULATOR

#import "NSLocale+ios8.h"
#import <objc/runtime.h>

@implementation NSLocale (iOS8)

+ (void)load
{
    Method originalMethod = class_getClassMethod(self, @selector(currentLocale));
    Method swizzledMethod = class_getClassMethod(self, @selector(swizzled_currentLocale));
    method_exchangeImplementations(originalMethod, swizzledMethod);
}

+ (NSLocale*)swizzled_currentLocale
{
    return [NSLocale localeWithLocaleIdentifier:LOCALE_IDENTIFIER];
}

@end

#endif

现在希望你看到的是相同的。

iOS8模拟器截图,带有德语键盘

还有一件事,使用这种方法可以获得一个愉悦的副作用:通过类别语言环境选择的键盘始终在使用,不依赖于系统设置和添加的键盘。因此,模拟器设置重置不需要再次添加键盘。

类别方法允许一次性覆盖所有目标的语言和区域设置,而无需单独更改每个目标方案中的这些参数。


请澄清一下。我在美国,我的自定义键盘没有出现,即使我删除了表情符号,它仍然会显示在列表中。这种方法能帮助我吗?(我已经按照发布的方式和使用LOCALE_IDENTIFIER @"en_US"尝试过了,但没有效果。) - Jeff
@Jeff,我的回答仅涉及由系统语言环境指导的默认键盘。 - malex
很好,谢谢。对于“ja”(日语)完美地运作了。 - Kalle
@konran,也许你只需要通过交换方式(swizzling)来修复preferredLanguages。我不确定,但可能主要包(main bundle)是基于当前的首选语言(preferred language)。 - malex
@malex,preferredLanguages总是以正确的顺序返回语言,例如[de, en]。我重新排列了pathForResource:ofType:,URLForResource:withExtension:及其派生方法,以处理目录(实际上有6种方法)- 就这样。无论如何,还是谢谢 :-) - konran
显示剩余4条评论

9
在您的目标设备上,进入编辑方案 -> 选择您的应用程序语言和应用程序区域(德语)。软件键盘可以切换布局,但硬件键盘不行。

我也可以。 - King-Wizard
你知道如何使用命令行来执行 xcodebuild / xcrun / instruments 吗? - Ron D.

7

在iOS 8.1版本中,有一个已知的问题会导致模拟器中无法显示键盘。

键盘已知问题:其他键盘(包括第三方键盘)可能无法在Safari、地图或第三方应用程序中出现在模拟器中。

解决方法:键盘应该可以在日历、Spotlight、联系人和照片中进行测试。

我理解这意味着您的封闭应用程序也无法正常工作。我的键盘无法在Safari或地图中显示,但在照片搜索栏中可以正常使用。


2

@malex的解决方案通过交换当前语言环境并将其添加到.pch文件中,几乎对我有用。它启用了区域键盘(丹麦语),但没有使它成为默认键盘。

要使其成为默认键盘,我还必须在NSLocale的preferredLanguages方法上进行交换。

感谢@malex。

总之,最终代码如下:

@interface NSLocale (iOS8)
@end

@implementation NSLocale (iOS8)

+ (void)load
{
    Method originalCurrentLocale = class_getClassMethod(self, @selector(currentLocale));
    Method swizzledCurrentLocale = class_getClassMethod(self, @selector(swizzled_currentLocale));
    method_exchangeImplementations(originalCurrentLocale, swizzledCurrentLocale);

    Method originalPreferredLanguages = class_getClassMethod(self, @selector(preferredLanguages));
    Method swizzledPreferredLanguages = class_getClassMethod(self, @selector(swizzled_preferredLanguages));
    method_exchangeImplementations(originalPreferredLanguages, swizzledPreferredLanguages);
}

+ (NSLocale *)swizzled_currentLocale
{
    return [NSLocale localeWithLocaleIdentifier:@"da_DK"];
}

+ (NSArray *)swizzled_preferredLanguages
{
    return @[@"da"];
}

@end

我有一个解决方案,但默认键盘是打开的笑脸表情符号,如何直接打开键盘? - Maulik shah

1
在设置应用中,前往“通用” > “键盘” > “键盘”,点击“添加新键盘”:

enter image description here

如果您的意思是模拟器无法接受来自硬件键盘的输入,您需要连接它(command-shift-K):

enter image description here

这是在硬件 > 键盘菜单中。

3
很遗憾,这一切都没有帮助! - pawi
1
我不明白为什么人们在没有留下评论的情况下就对这个答案进行了负评。这是唯一有用的东西。被接受的答案没有告诉我们当“应用程序语言”下没有“德语”时该怎么做。如果可以的话,我会点赞100次! - ParkerHalo

0
作为上述修复的替代方案,可以使用环境变量作为解决方法。
在Xcode的编辑方案>参数>环境变量下添加一个环境变量,例如"myLocale"。
(确保在您想要强制使用所选语言环境时启用环境变量) enter image description here 在您的代码中,您可以添加一个条件来检查环境变量是否已启用。
NSString *locale = [[[NSProcessInfo processInfo] environment] objectForKey:@"myLocale"];
if (locale) {
    NSLog(@"Using environment variable for locale");
} else{
    NSLog(@"Using locale configured from settings");
}

这样做还可以避免@William-hu上面报告的问题,例如“应用程序语言”部分只能选择“英语”和“系统语言”。 - user2990765

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接