web-dev-qa-db-ja.com

ドイツのハードウェアキーボードにもかかわらず、iOS 8.1シミュレーターは常にUSキーボードレイアウトを使用します

何らかの理由で、ネイティブのドイツ語キーボードでiOSシミュレーターにテキストを入力できなくなりました。

Xcode 6.1(iOS 8.1を含む)をダウンロードした後、米国のレイアウトに固執しました。

すべてのハードウェア/キーボード設定の変更、削除~/Library/Preferences/com.Apple.iphonesimulator.plist、およびiOSシミュレーターのリセット。

何も助けませんでした!

完全なパッケージを再インストールする必要がありますか?

51
pawi

これはiOS 8.1シミュレータのバグです。

使用されたスキームで「アプリケーション言語」を設定することにより、言語をテストできました。

[製品]> [スキーム]> [スキームの編集...]に移動するか、cmd + Yを押します。

出典: Apple Dev Forum 坂本義博の回答)==

enter image description here

35
dobiho

これは、iOS 8.1シミュレータランタイムの既知の問題であり、 Xcode 6.1リリースノート に記載されています。

ローカライズとキーボード設定(サードパーティのキーボードを含む)は、iOS 8.1シミュレーターのSafari、マップ、および開発者アプリでは正しく使用されません。 [NSLocale currentLocale]はen_USを返し、英語と絵文字のキーボードのみが使用可能です。 (18418630、18512161)

同じことは、ロケールだけでなくすべてのアプリに影響する他の設定(例:キーボード設定)にも当てはまります。

iOS SDK 8.2 beta 2リリースノート で述べたように、この問題はiOS 8.2で解決する必要があります。

ベータ2で修正されました。サードパーティのキーボードを含む追加のキーボードは、Safari、Maps、またはiOSシミュレータのサードパーティアプリに表示されない場合があります。

IOS 8.1を使用する必要がある場合、一部のアプリではドイツ語のレイアウトを使用できますが、他のアプリでは使用できません。たとえば、SafariとMapsは、動作しないアプリの2つの例です。

Before Appleを修正すると、NSLocale swizzlingに基づいて次のチェック済みソリューションを使用できます。

実際、iOS8.1シミュレーターで壊れている間違ったcurrentLocaleを置き換えるだけです。

カテゴリをプロジェクトに添付し、.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 simulator screenshot with German keyboard

もう1つ、このアプローチを使用すると、喜ばしい副作用が1つあります。カテゴリロケールで選択されたキーボードは常に使用されており、システム設定や追加されたキーボードに依存しません。そのため、シミュレーター設定のリセットでは、キーボードを再度追加する必要はありません。

カテゴリアプローチを使用すると、各ターゲットスキームでこれらのパラメーターを個別に変更することなく、すべてのターゲットの言語と地域の設定を一度にオーバーライドできます。

13
malex

ターゲットで編集スキームに移動->アプリケーションの言語とアプリケーション領域(ドイツ語)を選択します。ソフトウェアキーボードスイッチレイアウトOK、ハードウェアなし)

8.1には、キーボードがシミュレーターに表示されない別の既知の問題があります。

キーボードの既知の問題サードパーティのキーボードを含む追加のキーボードは、Safari、Maps、またはシミュレータ上のサードパーティアプリに表示されない場合があります。

回避策:キーボードは、カレンダー、スポットライト、連絡先、および写真でテスト可能である必要があります。

私はこれをあなたの包み込んでいるアプリも動作しないことを意味すると解釈します。キーボードはSafariやマップでは表示されませんが、写真の検索バーでは正常に機能します。

7

currentLocaleをスウィズルして.pchファイルに追加する@malex 'ソリューションは、ほとんど私にとってはうまくいきました。ロケールキーボード(デンマーク語)を有効にしましたが、デフォルトのキーボードにしませんでした。

それをデフォルトのキーボードにするために、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
2
micmdk

上記の修正の代わりに、回避策として環境変数を使用できます。

環境変数を追加し、「myLocale」と言います:Xcodeの「scheme> arguments> environment variables」を編集します。

(お好みのロケールを強制する場合は、必ず環境変数を有効にしてください) 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");
}
0
user2990765

設定アプリの[一般]> [キーボード]> [キーボード]で、[新しいキーボードの追加]をタップ(クリック)します。

enter image description here

シミュレーターがハードウェアキーボードからの入力を受け入れない場合は、接続する必要があります(command-shift-K):

enter image description here

これは、[ハードウェア]> [キーボード]メニューにあります。

0
Undo