Подтвердить что ты не робот

Программно показывать мягкую клавиатуру на iPhone в приложении PhoneGap?

Я долго и долго искал, и к этому моменту я не сталкивался с рабочим решением для приложений PhoneGap/Cordova, которые программно отображали программную клавиатуру.

Сценарий:

У нас есть приложение PhoneGap - веб-сайт, созданный в jQuery Mobile, который в какой-то момент показывает пользователю диалог. Этот диалог также является веб-страницей и имеет одно текстовое поле INPUT, в котором пользователь должен ввести код.

Проблема:

Когда отображается диалоговое окно кода, поле ввода фокусируется с использованием JavaScript. Однако из-за ограничений, установленных на внутреннем браузере iPhone, мягкая клавиатура не появляется, пока пользователь на самом деле не щелкнет внутри текстового поля ввода.

Что мы пробовали:

  • создание скрытого текстового поля и создание первого ответчика
  • делает фактический веб-просмотр первым ответчиком, когда вход получает фокус через JavaScript
  • с помощью sendActionsForControlEvents, чтобы попробовать и деактивировать события Touch для веб-просмотра (хотя, если у кого-либо есть рабочий код для приложения PhoneGap, я был бы признателен, если бы они могли поделиться им, так как я не профессионал в iOS)

Любые идеи?


EDIT: Ограничение, упомянутое в этом вопросе, предназначено только для встроенных браузеров. Если вы нацеливаете Opera, вы добьетесь успеха, используя следующие код:

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);
    }
};
4b9b3361

Ответ 1

Вы можете получить координаты для поля ввода, используя javascript в webView. Затем поместите свой собственный текстовый фильтр прямо поверх него и в нем делегируйте метод 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];

Ответ 2

Вы можете решить проблему с записью config.xml в эти дни, добавьте:

<preference name="keyboardDisplayRequiresUserAction" value="false" />

Ответ 3

До iOS 6 Apple разрешала клавиатуре подниматься после взаимодействия с пользователем. В iOS 6 они представили для UIWebView следующее свойство, для которого вам просто нужно установить NO.

    "yourWebView".keyboardDisplayRequiresUserAction = NO;

Apple устанавливает это по умолчанию на "Да". Теперь вы можете вызвать focus() в своем JS, и клавиатура появится.

Ответ 4

Вы пытались использовать Native Controls и вызывать их из Javascript?

Здесь у вас есть код, который показывает использование Native Controls в приложении Phonegap Cordova (Phonegap 1.5)

https://gist.github.com/1384250

Надеюсь, что это поможет решить проблему:)

Ответ 5

Я признаю, что это личное, но это может помочь вам:

@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();

Ответ 6

На самом деле я нашел решение для этого. Как говорит горак, и как описанный в этой статье, с или без мягкой клавиатуры, теперь можно добиться этого с помощью iOS 6.0, используя: KeyboardDisplayRequiresUserAction = NO;

Как и в случае с Cordova 2.2, упомянутое выше свойство iOS можно просто добавить в файл Cordova.plist:

KeyboardDisplayRequiresUserAction, boolean, NO

Это решает все для всех, кто использует Cordova 2.2. Теперь просто вызовите input.focus(), как обсуждалось ранее, и клавиатура автоматически появится. Для тех из нас, кто еще не обновил нашу Кордову до последней версии (2.2), она, к счастью, все еще возможна.

Программно показать клавиатуру на iPhone, используя cordova v. < 2.2

Шаг 1: Добавление свойства в Cordova.plist

Перейдите в свой проект > Ресурсы > Cordova.plist. Добавить: KeyboardDisplayRequiresUserAction, boolean, NO

Шаг 2: Добавление ниже фрагмента кода к CDVViewController.m

Поиск для "@interface CDVViewController" (или аналогично расположению над файлом). Для Кордовы 2.1 перейдите к строке 240 (все остальные идут в строку после инструкции "IsAtLeastiOSVersion" if, извините, не может быть более точным.) Добавить этот фрагмент кода на ваш CDVViewController.m в указанной выше строке:

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"];
    }

}

Отказ от ответственности. Это было протестировано только на Cordova 2.1, однако очень вероятно, что он по-прежнему работает с 2.0 или любой другой более ранней версией, поставляемой с файлом CDVViewController.m)

Ответ 7

Вы можете использовать событие FocusOut в поле ввода, и это будет срабатывать при нажатии клавиши "Готово". Я мог бы использовать это на IOS 6 и выше. Я считаю, что он будет работать и в предыдущих версиях.