iPhone UIWebview:如何强制使用数字键盘?可能吗?

时间:2009-04-21 18:06:17

标签: iphone keyboard uiwebview cordova

我正在尝试使用PhoneGap开发一些iPhone应用程序。 PhoneGap基本上包装了一个UIWebView - 它运行良好。问题是我的应用程序有几个输入字段只接受数字输入。我真的需要强制数字小键盘而不是接受默认的标准键盘,然后强制用户切换到每个字段上的数字。有谁知道这是否可能?怎么样?

澄清: 我知道Apple目前不提供任何API来实现这一点。我想知道创建一个从UIWebView继承的自定义类是否有帮助,或者创建自定义键盘是否会开辟一些可能性?

2009年11月6日更新 - 如下所述,Apple最近更新了safari功能,以便再次支持。所以接受的答案被改变以反映出来。

 <html>
<input type='tel'/>
<input type='number'/>
<input type='email'/>
<input />
</html>

10 个答案:

答案 0 :(得分:72)

看起来Mobile Safari支持电子邮件号码搜索 tel ,和 url 。这些将切换显示的键盘。请参阅the type attribute

例如,你可以这样做:

<input type="number" />

当输入框有焦点时,会显示数字键盘(好像用户有完整的键盘并点击“123”按钮。

如果您真的只想要数字,可以指定:

<input type="tel" />

然后用户将获得电话号码拨号键盘。

我知道这适用于Mobile Safari - 我只假设它适用于UIWebView。

答案 1 :(得分:28)

我发现更好的解决方案是在为移动和桌面浏览器设计表单时使用<input type="text" pattern="[0-9]*">

答案 2 :(得分:4)

来自Apple's documentation(关于UIWebView的说明):

  

您无法在输入元素中指定键盘类型。 Web视图显示基于默认键盘的自定义键盘,但包含一些用于在表单元素之间导航的附加控件。

答案 3 :(得分:4)

经过对IPhone OS 3.0

,这个功能还是不存在的,不知道为什么苹果只是删除这个方便的功能,真的很心烦对现在这个工作的权利:(

答案 4 :(得分:3)

以下是与iOS(4.0及更高版本)Web视图兼容的所有类型的列表:

http://conecode.com/news/2011/12/mobile-safari-uiwebview-input-types/

答案 5 :(得分:2)

这在iPhone OS的第一次迭代中是可能的 - Safari会给数字键盘形成名称中带有“zip”或“phone”的字段 - 但它在iPhone OS 2.0中消失了。

PhoneGap暂时没有API函数来覆盖它。它可能是他们正在努力的东西,它绝对是一个漂亮的功能。

答案 6 :(得分:1)

您需要在Dashcode项目的HTML部分进行更改:

  1. 在Dashcode中,在代码窗口中打开index.html。
  2. 在您正在处理的视图的画布上,选择要设置为使用优化键盘的输入字段。
  3. 点击index.html以获得焦点。
  4. 从Dashcode菜单栏中选择编辑&gt;查找。
  5. 在查找框中输入您为文本字段控件指定的确切名称。 Find将在index.html文件中找到该控件。
  6. 将类型从type="text"更改为type="number"
  7. 完成。

答案 7 :(得分:1)

iOS Mobile Safari还支持:

<input type="password" />

答案 8 :(得分:1)

您还可以使用基于iOS phonegap的应用程序:

input type="number" pattern="[0-9]*"

如下图所示。适用于iOS 8.2和3.0及以上的phonegap。

答案 9 :(得分:0)

iOs有一个数字键盘UIKeyboardTypeNumbersAndPunctuation,但无法从HTML调用(https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html

因为在“tel”键盘上缺少标点符号,你必须自己创建。由于ios8自定义键盘可用。或者,如果您只需要标点符号,则可以在数字键盘上添加一个按钮(How to add a 'Done' button to numpad keyboard in iOS),当您使用type="number" pattern="[0-9]*"指定输入字段时,该按键会弹出。

这样做:objective-c代码。

-(void)keyboardWillHide:(NSNotification *)note
{
    [self.donekeyBoardBtn removeFromSuperview];
    [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat: @"document.activeElement.blur()"]];
}

- (void)keyboardWillShow:(NSNotification *)note
{
    [UIView setAnimationsEnabled:NO];
    // create custom button
    //UIKeyboardTypeNumberPadin
    //type="number" pattern="[0-9]*"
    UIButton *extryB= [UIButton buttonWithType:UIButtonTypeRoundedRect];
    extryB.frame = CGRectMake(0, self.view.frame.size.height+150, 100, 50);
    extryB.backgroundColor = [UIColor colorWithRed:204.0f/255.0f
                                             green:210.0f/255.0f
                                              blue:217.0f/255.0f
                                             alpha:1.0f];
    extryB.adjustsImageWhenHighlighted = NO;
    extryB.titleLabel.font = [UIFont systemFontOfSize:14.0];
    [extryB setTitle:@"," forState:UIControlStateNormal];
    [extryB setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [extryB addTarget:self action:@selector(extryBpressed) forControlEvents:UIControlEventTouchUpInside];



self.donekeyBoardBtn = extryB;

// locate keyboard view
UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
UIView* keyboard;
for(int i=0; i<[tempWindow.subviews count]; i++)
{
    keyboard = [tempWindow.subviews objectAtIndex:i];
    // keyboard view found; add the custom button to it

    if([[keyboard description] hasPrefix:@"<UIInputSetContainerView"] == YES)
    {

        for(int i = 0 ; i < [keyboard.subviews count] ; i++)
        {
            UIView* hostkeyboard = [keyboard.subviews objectAtIndex:i];

            if([[hostkeyboard description] hasPrefix:@"<UIInputSetHost"] == YES)
            {
                UIButton* donebtn = (UIButton*)[hostkeyboard viewWithTag:67123];
                if (donebtn == nil){
                    //to avoid adding again and again as per my requirement (previous and next button on keyboard)

                    if([[self printKeyboardType] isEqualToString: @"UIKeyboardTypePhonePad"]){
                        [keyboard addSubview:extryB];
                    }

                }
            }
        }
    }
    //[keyboard addSubview:extryB];
}
[UIView setAnimationsEnabled:YES];
// animate
[UIView animateWithDuration:0.5 animations:^{
    extryB.frame = CGRectMake(0, self.view.frame.size.height-50, 100, 50);
}];
}

-(NSString*)printKeyboardType
{

NSString* strKeyboardType = @"";
switch (self.textDocumentProxy.keyboardType) {
    case UIKeyboardTypeAlphabet:
        strKeyboardType = @"UIKeyboardTypeAlphabet";
        break;
    case UIKeyboardTypeDecimalPad:
        strKeyboardType = @"UIKeyboardTypeAlphabet";
        break;
    case UIKeyboardTypeDefault:
        strKeyboardType = @"UIKeyboardTypeDefault";
        break;
    case UIKeyboardTypeEmailAddress:
        strKeyboardType = @"UIKeyboardTypeEmailAddress";
        break;
    case UIKeyboardTypeTwitter:
        strKeyboardType = @"UIKeyboardTypeTwitter";
        break;
    case UIKeyboardTypeNamePhonePad:
        strKeyboardType = @"UIKeyboardTypeNamePhonePad";
        break;
    case UIKeyboardTypeNumberPad:
        strKeyboardType = @"UIKeyboardTypeNumberPad";
        break;
    case UIKeyboardTypeNumbersAndPunctuation:
        strKeyboardType = @"UIKeyboardTypeNumbersAndPunctuation";
        break;
    case UIKeyboardTypePhonePad:
        strKeyboardType = @"UIKeyboardTypePhonePad";
        break;
    case UIKeyboardTypeURL:
        strKeyboardType = @"UIKeyboardTypeURL";
        break;
    case UIKeyboardTypeWebSearch:
        strKeyboardType = @"UIKeyboardTypeWebSearch";
        break;
    default:
        strKeyboardType = @"UNKNOWN";
        break;
}
NSLog(@"self.textDocumentProxy.keyboardType=%@", strKeyboardType);
return strKeyboardType;
}

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

- (void)extryBpressed{
    //simulates a "." press
    [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat: @"simulateKeyPress('.');"]];
}

然后你应该在你的JS代码中添加一个可以在应用程序范围内访问的方法。

simulateKeyPress: function(k) {
        var press = jQuery.Event("keypress");

        press.which = k;
        // place the id of your most outer html tag here
        $("#body").trigger(press);
            // just needed because my active element has a child element where the value should be placed in
                var id = document.activeElement.id.indexOf("-");
                if(id != -1){
                    var currentTf = sap.ui.getCore().byId(document.activeElement.id.split("-")[0]);
                    //append the value and set it (my textfield has a method setValue())
                    var currentTfValue = currentTf.getValue();
                    currentTf.setValue(currentTfValue + k);
                }
            },