IOS8.1 Simulator всегда использует раскладку клавиатуры в США, несмотря на немецкую аппаратную клавиатуру

По какой-то причине я больше не могу вводить текст с моей родной немецкой клавиатурой в iOS Simulator.

После загрузки XCode 6.1 (который содержит iOS 8.1), я застрял с макетом США.

Я пробовал такие вещи, как изменение всех настроек Hardware/Keyboard, удаление ~/Library/Preferences/com.apple.iphonesimulator.plist и сброс iOS-симулятора.

Ничего не помогло!

Должен ли я переустановить полный пакет?

Ответ 1

Это iOS 8.1 Симуляторы ошибок.

Я мог проверить язык, установив "Язык приложения" в используемой схеме.

Перейдите в раздел Продукт > Схемa > Изменить схему... или нажмите cmd + Y.

Источник: Ответ Yoshihiro Sakamoto в Apple Dev Forum

enter image description here

Ответ 2

Это известная проблема с версией симулятора iOS 8.1 и упоминается в Примечания к выпуску Xcode 6.1:

Настройки локализации и клавиатуры, в том числе сторонние клавиатуры, неправильно соблюдаются приложениями Safari, Maps и разработчика в iOS 8.1 Simulator. [NSLocale currentLocale] возвращает en_US, и доступны только английские и Emoji-клавиатуры. (18418630, 18512161)

То же самое относится к другим предпочтениям, которые должны влиять на все приложения, а не только на локаль (например: настройки клавиатуры).

Как упоминалось в iOS SDK 8.2 beta 2 Примечания к выпуску, эта проблема должна быть решена в iOS 8.2:

Исправлено в бета-версии 2 Дополнительные клавиатуры, включая сторонние клавиатуры, может не отображаться в Safari, Maps или сторонних приложениях в iOS Simulator

Если вам нужно использовать iOS 8.1, вы можете использовать немецкий макет в некоторых приложениях, но не другие. Например, Safari и Maps - это два примера приложений, с которыми он не будет работать.

Ответ 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

Надеюсь, теперь вы увидите то же самое

iOS8 simulator screenshot with German keyboard

Еще одна вещь, используя этот подход, вы получаете один приятный побочный эффект: клавиатура, выбранная по языку категории, всегда используется и не зависит от системных настроек и добавленных клавиш. Поэтому для установки симулятора reset не требуется снова добавлять клавиатуру.

Подкласс категории позволяет переопределять языковые и региональные настройки для всех целей одновременно без изменения этих параметров в каждой целевой схеме отдельно.

Ответ 4

на вашей целевой схеме редактирования → выберите приложение lang и область приложения (немецкий). программный клавиатурный переключатель макет ok, аппаратное обеспечение нет)

Ответ 5

Существует еще одна известная проблема с 8.1, которая заставляет клавиатуру не отображаться в симуляторе.

Клавиатуры Известный выпуск Дополнительные клавиатуры, в том числе сторонние клавиатурах, может не отображаться в Safari, Картах или сторонних приложениях на Тренажер.

Обходной путь: клавиатура должна проверяться в Календаре, Spotlight, Контакты и фотографии.

Я интерпретирую это как означающее, что ваше приложение для приложения не будет работать. Моя клавиатура не отображается в Safari или Maps, но отлично работает в панели поиска фотографий.

Ответ 6

@malex ', запустив currentLocale и добавив его в файл .pch, почти помогло. Он включил языковую клавиатуру (датский), но не сделал ее клавиатурой по умолчанию.

Чтобы сделать это клавиатурой по умолчанию, мне пришлось также использовать метод preferredLanguages ​​в NSLocale.

Спасибо @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

В качестве альтернативы исправлениям, упомянутым выше, можно использовать переменные среды в качестве работы.

Добавьте переменную окружения, скажем, "myLocale" в разделе: edit schem > arguments > переменные среды на Xcode.

(Обязательно включите переменную окружения всякий раз, когда вы хотите заставить локаль по своему вкусу) 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");
}

Ответ 8

В приложении "Настройки" в разделе "Основные" > "Клавиатура" > "Клавиатуры" нажмите (щелкните) "Добавить новую клавиатуру":

enter image description here

Если вы имеете в виду, что Simulator не будет принимать входные данные с вашей аппаратной клавиатуры, вам необходимо подключить его (command-shift-K):

enter image description here

Это меню Hardware > Keyboard.