Ios UitePutMode currentInputMode已弃用。建议更换?

Ios UitePutMode currentInputMode已弃用。建议更换?,ios,iphone,internationalization,keyboard,Ios,Iphone,Internationalization,Keyboard,在我们的应用程序中,我们希望检测当前的键盘语言。例如,如果用户在“设置”->“常规”->“键盘”->“键盘”下设置了多个语言键盘,我们希望了解他们输入的语言,并在更改时从NSNotificationCenter获得通知 - (void)viewDidLoad { [super viewDidLoad]; NSNotificationCenter *nCenter = [NSNotificationCenter defaultCenter]; [nCenter addObs

在我们的应用程序中,我们希望检测当前的键盘语言。例如,如果用户在“设置”->“常规”->“键盘”->“键盘”下设置了多个语言键盘,我们希望了解他们输入的语言,并在更改时从NSNotificationCenter获得通知

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSNotificationCenter *nCenter = [NSNotificationCenter defaultCenter];
    [nCenter addObserver:self selector:@selector(languageChanged:) name:UITextInputCurrentInputModeDidChangeNotification object:nil];
    [self languageChanged:nil];
}

-(void)languageChanged:(NSNotification*)notification
{
    for(UITextInputMode *mode in [UITextInputMode activeInputModes])
    {
        NSLog(@"Input mode: %@", mode);
        NSLog(@"Input language: %@", mode.primaryLanguage);
    }
    NSLog(@"Notification: %@", notification);
    UITextInputMode *current = [UITextInputMode currentInputMode];
    NSLog(@"Current: %@", current.primaryLanguage);
}
我们在这段代码中发现,当用户使用键盘上的globe图标切换键盘时,通知会相应地触发,但当我们迭代UITEmputModes时,它们以相同的顺序出现,没有(明显)指示哪个是当前的,除非我们使用现在已弃用的[输入模式电流输入模式]


我找不到任何文档表明苹果公司建议的替代方案,以取代目前已弃用的功能。有几个SO线程提到了弃用,但我没有找到解决方案。有什么想法吗?提前感谢。

更新您的代码,如下所示:

NSArray *current = [UITextInputMode activeInputModes];
UITextInputMode *current = [current firstObject];
UTextField* p = [[UITextField alloc] init];
p.hidden = YES;
[someView addSubview: p];
... = p.textInputMode.primaryLanguage;
[p removeFromSuperview];

通知UITestInputCurrentInputModeDidChangeNotification的对象是UITestInputMode的实例

UITextInputMode *currentInputMode = [notification object];
此外,您还可以在特定应答器上获得活动输入模式:

UITextView *textView = [[UITextView alloc] init];
UITextInputMode *currentInputMode = textView.textInputMode;

目前在iOS 7上,表情键盘的textInputMode/notification对象为零。不清楚这是否是故意的行为。

正确但愚蠢的答案是: 在作为视图HIRACHY一部分的UITextField上使用textInputMode

如果您(像我一样)碰巧没有一个(例如,因为您实现了inputView,并且没有找到第一响应者的正式方法),则可能如下所示:

NSArray *current = [UITextInputMode activeInputModes];
UITextInputMode *current = [current firstObject];
UTextField* p = [[UITextField alloc] init];
p.hidden = YES;
[someView addSubview: p];
... = p.textInputMode.primaryLanguage;
[p removeFromSuperview];
这是如此明显和简单,只需要3/4KB的堆。与UIKit库中的几个字节的代码相比。这真的很有意义…:-)


它在ios9上工作。在早期的iOS版本上未检查。

我认为您不应该创建新的
UITextView
UITextField

如果你的应用程序使用键盘,你已经有了一个。只需从现有的文本控件中获取
.textInputMode.primaryLanguage


如果您有多个文本视图/字段,但不知道哪一个处于活动状态,您可以在每个视图/字段上调用
isFirstResponder
。但是看起来您可以从任何文本控件中获取
textInputMode
,而不需要找到活动的视图/字段。

Swift 2.0

//richT is the TextView or textField
var language = richT.textInputMode?.primaryLanguage
print("language: \(language)")
//UITextInputMode().primaryLanguage - returns nil value

嗯,不起作用。活动输入模式的顺序并不反映当前模式。顺便说一句,不要求具有窗口属性