如何找出iOS8上使用的当前键盘?

您可以使用以下方式获取安装在iOS设备上的键盘列表:
NSUserDefaults *userDeafaults = [NSUserDefaults standardUserDefaults];
NSDictionary * userDefaultsDict = [userDeafaults dictionaryRepresentation];
NSLog(@"%@",userDefaultsDict);

这在控制台中产生一些东西,如:

{
    ...
    AppleKeyboards =     (
        "en_US@hw=US;sw=QWERTY","es_ES@hw=Spanish - ISO;sw=QWERTY-Spanish","emoji@sw=Emoji","com.swiftkey.SwiftKeyApp.Keyboard"
    );
    AppleKeyboardsExpanded = 1;
    ...
}

这告诉我,该设备安装了西班牙语,表情符号和SwiftKey键盘,但是当键盘出现时,它将告诉我什么都不会使用.

有没有办法告诉?

解决方法

没有公开的API,但是我发现了一个解决方案,它需要很少的“灰色区域API”(我将API定义为“灰色区域”,如果一个API通常不被暴露,但是可以很少隐藏工作).

iOS有以下类:UITextInputMode

这个类给你所有用户可以使用的输入方法.使用以下查询将会给您当前使用的,只有当键盘打开时:

UITextInputMode* inputMode = [[[UITextInputMode activeInputModes] filteredArrayUsingPredicate:[nspredicate predicateWithFormat:@"isdisplayed = YES"]] lastObject];

获取扩展名(或常规Apple键盘)的显示名称,请使用:

[inputMode valueForKey:@"displayName"]

要么

[inputMode valueForKey:@"extendeddisplayName"]

这只有当键盘可见时才有效.所以你必须自己监视输入模式的改变

[[NSNotificationCenter defaultCenter] addobserverForName:UITextInputCurrentInputModeDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note)
 {
     dispatch_async(dispatch_get_main_queue(),^{
         NSLog(@"%@",[[[[UITextInputMode activeInputModes] filteredArrayUsingPredicate:[nspredicate predicateWithFormat:@"isdisplayed = YES"]] lastObject] valueForKey:@"extendeddisplayName"]);
     });
 }];

我们实际上需要延迟获取当前的输入模式,因为通知是在键盘内部实现使用新值更新系统之前发送的.在下一个循环中获取它的效果很好.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...