UITextInputMode currentInputMode已被弃用。建议替代方案是什么?

6

在我们的应用中,我们希望检测当前键盘的语言。例如,如果用户在“设置”->“通用”->“键盘”->“键盘”下设置了多种语言键盘,我们想知道他们正在输入的语言,并在此更改时从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]。
我找不到任何说明苹果建议替代此现在已废弃功能的文档。有几个SO线程提到了弃用,但我没有找到解决方案。有什么想法吗?先谢谢了。
6个回答

7

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

UITextInputMode *currentInputMode = [notification object];

此外,您可以获取特定响应器的活动输入模式:
UITextView *textView = [[UITextView alloc] init];
UITextInputMode *currentInputMode = textView.textInputMode;

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


1
我认为你不应该创建新的UITextViewUITextField
如果你的应用程序使用键盘,那么你已经有了一个。只需从现有文本控件中获取.textInputMode.primaryLanguage即可。
如果你有多个文本视图/字段并且不知道哪个是活动的,可以在每个文本控件上调用isFirstResponder。但看起来你可以从任何文本控件获取textInputMode,而不需要找到活动的文本控件。

0

Swift 2.0

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

0
[UIApplication sharedApplication].delegate.window.textInputMode

它可以在iOS9上运行。尚未在早期版本的iOS上进行过检查。


顺便提一下,<UIApplicationDelegate> 不需要具有 window 属性。 - zxcat

0
正确但愚蠢的答案是:在视图层次结构中使用UITextField上的textInputMode。
如果您(像我一样)没有一个(例如,因为您实现了一个inputView并且没有官方方法找到第一个响应者),那么可能看起来像这样:
UTextField* p = [[UITextField alloc] init];
p.hidden = YES;
[someView addSubview: p];
... = p.textInputMode.primaryLanguage;
[p removeFromSuperview];

这很明显和简单,只需要3/4KB的堆。与UIKit库中几个字节的代码相比,这真的很有意义... :-)


-3

请按照以下方式更新您的代码:

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

6
嗯,不起作用。当前输入模式的顺序似乎并不反映哪个是当前模式。 - Anders Johansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接