【问题标题】:iOS 8.1 Simulator always uses US keyboard layout despite german hardware keyboard尽管有德语硬件键盘,iOS 8.1 Simulator 始终使用美式键盘布局
【发布时间】:2014-11-26 14:33:35
【问题描述】:

由于某种原因,我无法再使用本地德语键盘在 iOS 模拟器中输入文本。

下载 Xcode 6.1(包含 iOS 8.1)后,我被美国的布局卡住了。

我尝试了更改所有硬件/键盘设置、删除 ~/Library/Preferences/com.apple.iphonesimulator.plist 以及重置 iOS 模拟器等操作。

没有任何帮助!

我应该重新安装完整的软件包吗?

【问题讨论】:

  • 我会启用:硬件-> 键盘->切换软件键盘并更改软键盘中的区域设置,然后我可以输入我的硬件键盘

标签: ios xcode keyboard ios-simulator


【解决方案1】:

这是 iOS 8.1 模拟器运行时的一个已知问题,在 Xcode 6.1 Release Notes 中有所提及:

iOS 8.1 模拟器中的 Safari、地图和开发者应用程序无法正确支持本地化和键盘设置,包括第 3 方键盘。 [NSLocale currentLocale] 返回 en_US 并且只有英文和表情符号键盘可用。 (18418630, 18512161)

对于应该影响所有应用程序而不仅仅是区域设置的其他首选项也是如此(例如:键盘设置)。

正如iOS SDK 8.2 beta 2 Release Notes 中提到的,这个问题应该在iOS 8.2 中得到解决:

在 beta 2 中修复 附加键盘,包括第 3 方键盘, 可能不会出现在 Safari、地图或 iOS 模拟器的第 3 方应用中

如果您需要使用 iOS 8.1,您应该能够在某些应用程序中使用德语布局,但在其他应用程序中则不能。例如,Safari 和 Maps 是两个无法使用的应用示例。

【讨论】:

  • 对不起,不完全理解你的意思:“如果你想用骗子“投票”这个错误,请提交额外的雷达。我在使用 Safari 或 Maps 等其他程序时没有遇到任何问题!?
  • 我的意思是,虽然这已经是一个已知问题,但您应该在 bugreport.apple.com 提交自己的雷达
  • 如果这是一个已知问题,是否每个人都有这个问题?我在其他地方找不到任何关于此的投诉!
  • 这个NSLocale 问题是否也会导致[[NSLocale preferredLanguages] objectAtIndex:0] 总是返回"en"?这似乎与我遇到的问题相似,@JeremyHuddlestonSequoia 你能帮我看看这个吗?谢谢! stackoverflow.com/questions/26572115/…
  • 是的。根本问题是全局偏好在 8.1 sim 中不起作用。键盘设置和本地化是此类偏好中最明显的。我会努力更新发行说明,以便更清晰。
【解决方案2】:

这是 iOS 8.1 Simulator 的错误。

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

转到产品 > 方案 > 编辑方案...或按 cmd + Y。

来源:Answer of Yoshihiro Sakamoto in Apple Dev Forum

【讨论】:

  • 太棒了!这解决了我的问题!我明确地将应用程序语言设置为“德语”,瞧,模拟器接受了我的德语键盘!非常感谢!
  • 为什么我的“应用程序语言”部分只能选择“英语”和“系统语言”而没有我想要的国家?即使我已经更改了我想要设置的模拟器语言。
  • 这帮我节省了很多测试时间,非常感谢
  • 你是怎么找到那个屏幕的?好像到处都找不到?
  • 我不得不这样做并更改模拟器系统语言
【解决方案3】:

在 Apple 进行修复之前,可以使用以下基于 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

希望你现在看到的也一样

还有一件事,使用这种方法您会得到一个令人愉快的副作用:通过类别区域设置选择的键盘始终处于使用状态,并且不依赖于系统设置和添加的键盘。所以模拟器设置重置不需要再次添加键盘。

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

【讨论】:

  • 请澄清。我在美国,我的自定义键盘没有出现,即使我删除了表情符号,它也总是列出来。这种方法可以在这里帮助我吗? (我已经尝试过发布并使用 LOCALE_IDENTIFIER @"en_US" 但它没有效果。)
  • @Jeff,我的回答只涉及由系统语言环境引导的默认键盘。
  • 很好,谢谢。非常适合 @"ja"(日语)。
  • 使用您的代码,NSLocale 被正确报告为 de_DE。是否有类似的方法可以从当前的 EN 和 DE 本地化加载正确的故事板,而无需基本本地化,例如NSBundle 分类?
  • @konran,对不起,我没有答案。
【解决方案4】:

在您的目标 go 编辑方案上 -> 选择您的应用程序语言和应用程序区域(德语)。软键盘开关布局ok,硬件不行)

【讨论】:

  • 也适合我。
  • 您知道如何从命令行执行此操作吗?对于 xcodebuild / xcrun / 仪器?
【解决方案5】:

8.1 的另一个已知问题会导致键盘在模拟器中不显示。

键盘已知问题 其他键盘,包括第 3 方 键盘,可能不会出现在 Safari、地图或第三方应用程序中 模拟器。

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

我将此解释为您的封闭应用程序也无法运行。我的键盘不会在 Safari 或地图中显示,但在照片搜索栏中可以正常使用。

【讨论】:

    【解决方案6】:

    @malex' 通过调整 currentLocale 并将其添加到 .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
    

    【讨论】:

    • 我有一个解决方案,但默认键盘是笑着打开的,我怎么能直接打开打开键盘..
    【解决方案7】:

    在“设置”应用中,在“常规”>“键盘”>“键盘”下,点按(单击)添加新键盘:

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

    这在硬件 > 键盘菜单中。

    【讨论】:

    • 不幸的是,这一切都没有帮助!
    • 我不明白为什么人们不发表评论就否决了这个答案。这是唯一有帮助的。接受的答案并没有说明当“应用程序语言”下没有“德语”时该怎么做,如果可以的话,我会投票 100 次!
    【解决方案8】:

    作为上述修复的替代方法,可以使用环境变量作为解决方法。

    添加一个环境变量,例如“myLocale”,位于:edit scheme>arguments>Xcode 上的环境变量。

    (确保在您想要强制使用您喜欢的语言环境时启用环境变量)

    在您的代码中,您可以添加一个条件来检查环境变量是否已启用。

    NSString *locale = [[[NSProcessInfo processInfo] environment] objectForKey:@"myLocale"];
    if (locale) {
        NSLog(@"Using environment variable for locale");
    } else{
        NSLog(@"Using locale configured from settings");
    }
    

    【讨论】:

    • 这样你也可以避免上面@William-hu 报告的“应用程序语言”部分只能选择“英语”和“系统语言”的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2011-06-22
    • 1970-01-01
    相关资源
    最近更新 更多