不推荐使用UITextInputMode currentInputMode。建议更换?

时间:2014-03-24 16:01:52

标签: ios iphone internationalization keyboard

在我们的应用中,我们想要检测当前的键盘语言。例如,如果用户在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线程提到了弃用,但我找不到解决方案。有任何想法吗?提前谢谢。

6 个答案:

答案 0 :(得分:7)

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

UITextInputMode *currentInputMode = [notification object];

此外,您可以在特定响应者上获得活动输入模式:

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

目前在iOS 7上,表情符号键盘的textInputMode / notification对象为nil。目前还不清楚这是否是预期的行为。

答案 1 :(得分:1)

我认为您不应该创建新的UITextViewUITextField

如果您的应用使用键盘,那么您已拥有一个。只需从现有的文本控件中获取.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];