在我们的应用中,我们想要检测当前的键盘语言。例如,如果用户在Settings-> General-> Keyboard-> Keyboards下设置多个语言键盘,我们想知道他们输入的是哪种语言,并在此更改时从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图标切换键盘时,通知会正常触发,但是当我们迭代UITextInputModes时,它们以相同的顺序显示,没有(明显)指示除非我们使用现已弃用的[UITextInputMode currentInputMode],否则这是当前的。
我找不到任何文档,表明Apple建议替代现已弃用的功能。有几个SO线程提到了弃用,但我找不到解决方案。有任何想法吗?提前谢谢。
答案 0 :(得分:7)
通知对象UITextInputCurrentInputModeDidChangeNotification是UITextInputMode的一个实例。
UITextInputMode *currentInputMode = [notification object];
此外,您可以在特定响应者上获得活动输入模式:
UITextView *textView = [[UITextView alloc] init];
UITextInputMode *currentInputMode = textView.textInputMode;
目前在iOS 7上,表情符号键盘的textInputMode / notification对象为nil。目前还不清楚这是否是预期的行为。
答案 1 :(得分:1)
我认为您不应该创建新的UITextView
或UITextField
。
如果您的应用使用键盘,那么您已拥有一个。只需从现有的文本控件中获取.textInputMode.primaryLanguage
。
如果您有多个文本视图/字段但不知道哪一个是活动的,则可以在每个视图上调用isFirstResponder
。但看起来你可以从任何文本控件中获取textInputMode
,而不需要找到活动文件。
答案 2 :(得分:0)
正确但愚蠢的答案是: 在UITextField上使用textInputMode,它是view-hirarchy的一部分。
如果你发生(像我一样)没有一个(例如因为你实现了一个inputView而没有找到第一个响应者的官方方法),可能看起来像这样:
UTextField* p = [[UITextField alloc] init];
p.hidden = YES;
[someView addSubview: p];
... = p.textInputMode.primaryLanguage;
[p removeFromSuperview];
这是如此明显和简单,只需要3 / 4KB的堆。与UIKit-Library中的几个字节的代码相比。这真的很有意义......: - )
答案 3 :(得分:0)
[UIApplication sharedApplication].delegate.window.textInputMode
适用于ios9。未在早期iOS版本上检查过。
答案 4 :(得分:0)
Swift 2.0
//richT is the TextView or textField
var language = richT.textInputMode?.primaryLanguage
print("language: \(language)")
//UITextInputMode().primaryLanguage - returns nil value
答案 5 :(得分:-3)
像这样更新你的代码:
NSArray *current = [UITextInputMode activeInputModes];
UITextInputMode *current = [current firstObject];