Симулятор iOS 8.1 всегда использует американскую раскладку клавиатуры, несмотря на немецкую аппаратную клавиатуру
По какой-то причине я больше не могу вводить текст с помощью своей родной немецкой клавиатуры в iOS Simulator.
После загрузки Xcode 6.1 (который содержит iOS 8.1) я застрял с американским макетом.
Я пробовал такие вещи, как изменение всех настроек оборудования / клавиатуры, удаление ~/Library/Preferences/com.apple.iphonesimulator.plist
и сброс симулятора iOS.
Ничего не помогло!
Должен ли я переустановить весь пакет?
8 ответов
Это ошибки симулятора iOS 8.1.
Я мог проверить язык, установив "Язык приложения" в используемой схеме.
Перейдите в Product > Scheme > Edit Scheme... или нажмите cmd + Y.
Это известная проблема со временем выполнения симулятора iOS 8.1, о которой говорится в примечаниях к выпуску Xcode 6.1:
Настройки локализации и клавиатуры, включая сторонние клавиатуры, неправильно учитываются Safari, Картами и приложениями для разработчиков в имитаторе iOS 8.1. [NSLocale currentLocale] возвращает en_US, и доступны только английская и Emoji клавиатуры. (18418630, 18512161)
То же самое относится и к другим настройкам, которые должны влиять на все приложения, а не только на локаль (например, настройки клавиатуры).
Как упоминалось в примечаниях к выпуску iOS SDK 8.2 beta 2, эта проблема должна быть решена в iOS 8.2:
Исправлено в бета-версии 2 Дополнительные клавиатуры, в том числе сторонние, могут не отображаться в Safari, Картах или сторонних приложениях в iOS Simulator
Если вам нужно использовать iOS 8.1, вы сможете использовать немецкий макет в некоторых приложениях, но не в других. Например, Safari и Карты - два примера приложений, с которыми он не будет работать.
Прежде чем 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
Надеюсь, теперь вы видите то же самое
Еще одна вещь, используя этот подход, вы получаете один приятный побочный эффект: клавиатура, выбранная с помощью языкового стандарта категории, всегда используется и не зависит от системных настроек и добавленных клавиатур. Таким образом, сброс настроек симулятора не требует добавления клавиатуры снова.
Категориальный подход позволяет переопределить языковые и региональные настройки для всех целей одновременно, не внося изменений в эти параметры в каждой целевой схеме отдельно.
На вашей цели перейдите на схему редактирования -> выберите язык приложения и регион приложения (немецкий). Клавиатура с программным обеспечением в порядке, аппаратного обеспечения нет)
Есть еще одна известная проблема с 8.1, из-за которой клавиатуры не отображаются в симуляторе.
Известные проблемы с клавиатурой Дополнительные клавиатуры, в том числе сторонние клавиатуры, могут не отображаться в Safari, Картах или сторонних приложениях на Симуляторе.
Обходной путь: Клавиатуры должны быть тестируемыми в Календаре, Центре внимания, Контактах и Фото.
Я понимаю, что ваше приложение не будет работать. Моя клавиатура не отображается в Safari или в Картах, но отлично работает в панели поиска фотографий.
Решение @malex', быстро добавив currentLocale и добавив его в файл.pch, практически помогло мне. Он включил языковую клавиатуру (датский), но не сделал ее клавиатурой по умолчанию.
Чтобы сделать его клавиатурой по умолчанию, мне также пришлось переключить метод предпочитаемого языка в 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
В приложении "Настройки" в разделе "Основные"> "Клавиатура"> "Клавиатуры" нажмите (нажмите) Добавить новую клавиатуру:
Если вы имеете в виду, что симулятор не будет принимать ввод с вашей аппаратной клавиатуры, вам нужно подключить его (command-shift-K):
Это в меню Hardware > Keyboard.
В качестве альтернативы упомянутым выше исправлениям можно использовать переменные среды в качестве обходного пути.
Добавьте переменную окружения, скажем "myLocale" в разделе: изменить схему> аргументы> переменные окружения в Xcode.
(Обязательно включайте переменную среды всякий раз, когда вы хотите настроить язык по своему вкусу)
В своем коде вы можете добавить условие, чтобы проверить, включена ли переменная среды.
NSString *locale = [[[NSProcessInfo processInfo] environment] objectForKey:@"myLocale"];
if (locale) {
NSLog(@"Using environment variable for locale");
} else{
NSLog(@"Using locale configured from settings");
}