UITextInputMode currentInputMode已弃用。 build议更换?

在我们的应用程序中,我们希望检测当前的键盘语言。 例如,如果用户在“设置” – >“常规” – >“键盘” – >“键盘”下设置了多个语言键盘,我们希望知道它们正在input什么语言,并在发生更改时从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); } 

我们用这段代码发现的是,当用户使用键盘上的地球图标来切换键盘时,通知会适当地触发,但是当我们迭代UITextInputModes时,它们以相同的顺序出现,没有(明显的)除非我们使用现在不推荐使用的[UITextInputMode currentInputMode]。

我找不到任何文件显示苹果build议替代这个现在不赞成使用的function。 有几个SO线程提到了弃用,但我没有find解决scheme。 有任何想法吗? 提前致谢。

通知UITextInputCurrentInputModeDidChangeNotification的对象是UITextInputMode的一个实例。

 UITextInputMode *currentInputMode = [notification object]; 

另外,您可以在特定的响应者上获得主动input模式:

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

目前在iOS 7中,表情符号键盘的textInputMode / notification对象为零。 目前还不清楚这是否是有意的行为。

正确但愚蠢的答案是:使用textInputMode UITextField是视图的一部分。

如果你发生(像我一样)没有一个(例如,因为你实现了一个inputView,没有find第一个响应者的官方方式),可能看起来像这样:

 UTextField* p = [[UITextField alloc] init]; p.hidden = YES; [someView addSubview: p]; ... = p.textInputMode.primaryLanguage; [p removeFromSuperview]; 

这是如此明显和简单,只需要3/4KB的堆。 相比于UIKit-Library中的几个字节的代码。 这真的有道理… 🙂

 [UIApplication sharedApplication].delegate.window.textInputMode 

它适用于ios9。 不在早期的iOS版本上检查。

我不认为你应该创build新的UITextViewUITextField

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

如果你有几个文本视图/字段,不知道哪一个是活动的,你可以调用isFirstResponder 。 但看起来像你可以从任何文本控件textInputMode ,并不需要find活动的一个。

Swift 2.0

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

像这样更新你的代码:

 NSArray *current = [UITextInputMode activeInputModes]; UITextInputMode *current = [current firstObject];