我一直在寻找远又长,和这一刻,我没碰到过的PhoneGap的/科尔多瓦应用程序将以编程显示软键盘工作的解决方案来。
场景:
我们有一个PhoneGap的应用程序 - 在jQuery Mobile的创建了一个网站 - 即在一个点上显示一个对话框给用户。 这个对话框也有网页,有一个单独的文本输入框,用户需要输入一个代码。
问题:
当显示的代码对话框, 输入框是使用JavaScript聚焦 。 然而,由于放置在iPhone的内部浏览器限制,软键盘不来,直到用户实际真正的输入文本框内单击。
我们尝试:
- 创建一个隐藏的文本框 ,并使其成为第一个响应
- 在进行实际网页视图的第一响应者一旦输入通过JavaScript获得焦点
- 使用sendActionsForControlEvents尝试和国内配送触摸事件的网页视图(虽然如果任何人有一个PhoneGap的应用程序工作的代码,我将不胜感激,如果他们能分享它,因为我没有专业的iOS中的编码)
有任何想法吗?
编辑:在这个问题中提及的限制是内置的浏览器只有...如果你的目标戏,你会用下面的代码的成功:
var e = jQuery.Event("keydown", { keyCode: 37 });
$('#element').focus().trigger(e);
EDIT2:这是一个可以在插件中使用的最终工作的PhoneGap代码:
keyboardhelper.h
//
// keyboardHelper.h
// soft keyboard displaying plugin for PhoneGap
//
// Copyright 2012 Martin Ambrus.
//
#import <Foundation/Foundation.h>
#ifdef CORDOVA_FRAMEWORK
#import <Cordova/CDVPlugin.h>
#else
#import "CDVPlugin.h"
#endif
@interface keyboardHelper : CDVPlugin {
NSString *callbackID;
}
@property (nonatomic, copy) NSString *callbackID;
- (void)showKeyboard:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
@end
keyboardhelper.m
//
// keyboardHelper.m
// soft keyboard displaying plugin for PhoneGap
//
// Copyright 2012 Martin Ambrus.
//
#import "keyboardHelper.h"
#import "AppDelegate.h"
@implementation keyboardHelper
@synthesize callbackID;
-(void)showKeyboard:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options {
self.callbackID = [arguments pop];
//Get text field coordinate from webview. - You should do this after the webview gets loaded
//myCustomDiv is a div in the html that contains the textField.
int textFieldContainerHeightOutput = [[((AppDelegate *)[[UIApplication sharedApplication] delegate]).viewController.webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"myCustomDiv\").offsetHeight;"] intValue];
int textFieldContainerWidthOutput = [[((AppDelegate *)[[UIApplication sharedApplication] delegate]).viewController.webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"myCustomDiv\").offsetWidth;"] intValue];
int textFieldContainerYOffset = [[((AppDelegate *)[[UIApplication sharedApplication] delegate]).viewController.webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"myCustomDiv\").offsetTop;"] intValue];
int textFieldContainerXOffset = [[((AppDelegate *)[[UIApplication sharedApplication] delegate]).viewController.webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"myCustomDiv\").offsetLeft;"] intValue];
UITextField *myTextField = [[UITextField alloc] initWithFrame: CGRectMake(textFieldContainerXOffset, textFieldContainerYOffset, textFieldContainerWidthOutput, textFieldContainerHeightOutput)];
[((AppDelegate *)[[UIApplication sharedApplication] delegate]).viewController.webView addSubview:myTextField];
myTextField.delegate = self;
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString: @"ok"];
[self writeJavascript:[pluginResult toSuccessCallbackString:self.callbackID]];
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
//here you create your request to the server
return NO;
}
-(BOOL)textFieldDidEndEditing:(UITextField *)textField
{
//here you create your request to the server
return NO;
}
@end
JavaScript的
var keyboardHelper = {
showKeyboard: function(types, success, fail) {
return Cordova.exec(success, fail, "keyboardHelper", "showKeyboard", types);
}
};
你可以使用的web视图的JavaScript输入字段的坐标。 然后,将正确的在它的上面,并在它的委托方法你自己的文本字段textFieldShouldReturn发送到与用户键入的代码服务器的请求。
//Get text field coordinate from webview. - You should do this after the webview gets loaded
//myCustomDiv is a div in the html that contains the textField.
int textFieldContainerHeightOutput = [[webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"myCustomDiv\").offsetHeight;"] intValue];
int textFieldContainerWidthOutput = [[webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"myCustomDiv\").offsetWidth;"] intValue];
int textFieldContainerYOffset = [[webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"myCustomDiv\").offsetTop;"] intValue];
int textFieldContainerXOffset = [[webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"myCustomDiv\").offsetLeft;"] intValue];
myTextField.frame = CGRectMake(textFieldContainerXOffset, textFieldContainerYOffset, textFieldContainerWidthOutput, textFieldContainerHeightOutput);
[webView addSubview:myTextField];
myTextField.delegate = self;
然后你实现textFieldShouldReturn并创建请求到服务器那里。
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
//here you create your request to the server
return NO;
}
这是在现有的项目做,但是不使用PhoneGap的。 我希望你能适应它以满足您的需求。
要删除文本字段,可以将其隐藏
myTextField.hidden = YES;
要么
myTextField = nil;
要么
[myTextField removeFromSuperView];
你可以用一个解决问题config.xml
条目中的这些日子里,添加:
<preference name="keyboardDisplayRequiresUserAction" value="false" />
在此之前的iOS 6,苹果只允许提出了以下用户交互的键盘。 在iOS 6中,他们已经推出了UIWebView的下列财产,你只需要设置为NO。
"yourWebView".keyboardDisplayRequiresUserAction = NO;
苹果在默认情况下将其设置为“是”。 现在,你可以调用focus()
在你的JS和键盘会出现。
你是否尝试过使用本地控件,并从Javascript调用它们?
在这里,你有一些代码,显示本机控件的一个PhoneGap的应用科尔多瓦的使用(PhoneGap的1.5)
https://gist.github.com/1384250
希望它可以帮助解决问题:)
我承认这是私人的,但它可能会帮助你:
@class UIKeyboard;
void showKeyboard()
{
static UIKeyboard *kb = nil;
if ([[UIKeyboard class] respondsToSelector:@selector(automaticKeyboard)])
kb = [UIKeyboard automaticKeyboard];
else
kb = [UIKeyboard activeKeyboard];
if (kb == nil) {
kb = [[[UIKeyboard alloc] initWithDefaultSize] autorelease];
[[[UIApplication sharedApplication] keyWindow] addSubview:kb];
}
if ([kb respondsToSelector:@selector(orderInWithAnimation:)]) {
[kb orderInWithAnimation:YES];
} else {
[kb activate];
[kb minimize];
[kb maximize];
}
}
而这样称呼它:
showKeyboard();
我其实只是找到了解决这个 。 像霍拉克说和这篇文章中描述 ,有或没有软键盘,它现在可以与iOS 6.0通过实现这一点:KeyboardDisplayRequiresUserAction = NO;
作为科尔多瓦2.2的,上面提到的性质的iOS可简单地添加到该文件Cordova.plist:
KeyboardDisplayRequiresUserAction, boolean, NO
这解决了这一切用科尔多瓦2.2每一个人。 现在,只需要调用input.focus()如前所述,与键盘就会自动出现。 对于我们这些谁尚未更新我们的科尔多瓦目前的最新版本(2.2),这是幸运还是可以的 。
用科尔多瓦V,而iPhone编程显示键盘。<2.2
第1步 : 添加属性Cordova.plist
转到您的项目>资源> Cordova.plist。 地址:KeyboardDisplayRequiresUserAction,布尔,NO
步骤2: 添加以下代码段,以CDVViewController.m
搜索 “@interface CDVViewController”(或类似的定位上面的文件)。 对于科尔多瓦2.1,转到行240 这个代码片段添加到上述线路的CDVViewController.m(其他人去行之后“IsAtLeastiOSVersion” if语句,对不起,不能比这更精确。):
if (IsAtLeastiOSVersion(@"6.0")) {
BOOL keyboardDisplayRequiresUserAction = YES; // KeyboardDisplayRequiresUserAction - defaults to YES
if ([self.settings objectForKey:@"KeyboardDisplayRequiresUserAction"] != nil) {
if ([self.settings objectForKey:@"KeyboardDisplayRequiresUserAction"]) {
keyboardDisplayRequiresUserAction = [(NSNumber*)[self.settings objectForKey:@"KeyboardDisplayRequiresUserAction"] boolValue]; //JB-VAL121212
}
}
// property check for compiling under iOS < 6
if ([self.webView respondsToSelector:@selector(setKeyboardDisplayRequiresUserAction:)]) {
[self.webView setValue:[NSNumber numberWithBool:keyboardDisplayRequiresUserAction] forKey:@"keyboardDisplayRequiresUserAction"];
}
}
免责声明 : 这一问题已经在科尔多瓦2.1只测试,它是,但是,很可能它仍然有2.0或随附CDVViewController.m文件中的任何其他早期版本的作品)
您可以在输入字段中使用focusOut事件,并按下Done键时,这将被解雇。 我可以在IOS 6及以上使用这个。 我相信它也将以前的版本。