Действие касания в представлении стека не работает должным образом, когда текстовое поле выбрано для iOS с помощью Nativescript

Поэтому я использую Nativescript для создания приложений как для Android, так и для iOS, и у меня проблемы с iOS.

Итак, у меня есть представление стека, в котором я добавил действие касания под названием «closeKeyboard» (в настоящее время просто выводит сообщение на консоль). Внутри представления стека у меня есть текстовое поле. Проблема в том, что когда я нажимаю на текстовое поле, также запускается действие просмотра стека.

На Android это работает должным образом - выбор текстового поля не запускает действие просмотра стека.

Вот код для main-page.xml

<Page xmlns="http://schemas.nativescript.org/tns.xsd" navigatingTo="onNavigatingTo">
  <StackLayout tap="closeKeyboard">
    <Label class="conf-button-label" text="Netto sum" />
    <TextField text="{{ sum }}" hint="Type number" returnKeyType="done" keyboardType="number" keyboardPatter="[0-9]*" returnPress="done" id="sum" col="0" row="0"  class=""/>
  </StackLayout>
</Page>

Вот код для main-page.js

var createViewModel = require("./main-view-model").createViewModel;
function onNavigatingTo(args) {
    page = args.object;
}

function done(){
    console.log('Input Done');
}


function closeKeyboard(page){
    console.log('Close Keyboard Tapped');
}
exports.done = done;
exports.closeKeyboard = closeKeyboard;
exports.onNavigatingTo = onNavigatingTo;

Кто-нибудь может мне с этим помочь?


person Janis    schedule 07.07.2016    source источник


Ответы (2)


Если вы хотите создать что-то вроде события размытия javascript или просто скрыть клавиатуру, когда вы нажимаете за пределами TextView, вы можете установить собственный жест для ios, используя собственный код. Вы можете просмотреть прилагаемый ниже пример:

main-page.xml

<Page xmlns="http://schemas.nativescript.org/tns.xsd" loaded="loaded">
  <StackLayout id="stack">
    <Label text="Tap the button" class="title"/>
    <Button text="TAP" tap="{{ onTap }}" />
    <Label text="{{ message }}" class="message" textWrap="true"/>
    <TextView id="text" text="" hint="Enter some text" backgroundColor="yellow" updateTextTrigger="focusLost"/>
  </StackLayout>
</Page>

main-page.js

var createViewModel = require("./main-view-model").createViewModel;
var gestures = require("ui/gestures");
var observableModule = require("data/observable"); 
var observableObject = new observableModule.Observable();

var TapHandlerImpl1 = (function (_super) {
    __extends(TapHandlerImpl1, _super);
    function TapHandlerImpl1() {
        _super.apply(this, arguments);
    }
    TapHandlerImpl1.initWithOwner = function (owner) {
        var handler = TapHandlerImpl1.new();
        handler._owner = owner;
        return handler;
    };
    TapHandlerImpl1.prototype.tap = function () {
        this._owner.ios.resignFirstResponder();
    };
    TapHandlerImpl1.ObjCExposedMethods = {
        "tap": { returns: interop.types.void, params: [interop.types.id] }
    };
    return TapHandlerImpl1;
}(NSObject));

var tapHandler = null;

function loaded(args) {
    var page = args.object;
    var field = page.getViewById("text");
    if (page.ios) {
        tapHandler = TapHandlerImpl1.initWithOwner(field)
        var recognizer = UITapGestureRecognizer.alloc().initWithTargetAction(tapHandler, "tap");
        page.ios.view.addGestureRecognizer(recognizer);
    }

    field.addEventListener(observableModule.Observable.propertyChangeEvent, function(pcd){
        console.log(pcd.eventName.toString() + " " + pcd.propertyName.toString() + " " + pcd.value.toString());
    });

    page.bindingContext = observableObject; } 
exports.loaded = loaded;

Однако та же проблема обсуждалась также в этом выпуске GitHub.

person Nikolay Tsonev    schedule 07.07.2016
comment
Большое спасибо. Это мне очень помогло. Но, может быть, вы знаете, как я могу делать какие-то действия, когда клавиатура была закрыта? В моем текущем проекте расчет выполняется только тогда, когда я нажимаю «Готово» на клавиатуре, но было бы здорово отправить свой ввод после закрытия клавиатуры. Я верю, что в IOS это называется UIKeyboardWillHideNotification - person Janis; 07.07.2016
comment
Вы можете добавить прослушиватель событий изменения свойства в текстовое поле. В этом случае вы также должны добавить updateTextTrigger="focusLost" в текстовое поле, которое вернет вам все значение из свойства text, только когда текстовое поле теряет фокус. - person Nikolay Tsonev; 08.07.2016
comment
Вы можете просмотреть статью здесь - docs.nativescript.org/core-concepts/events # propertychange-event - person Nikolay Tsonev; 08.07.2016

Я думаю, что единственный способ - переместить closeKeyboard() из Stacklayout в ярлык дочернего представления. Или вы можете попытаться определить отдельное действие касания для текстового поля, чтобы переопределить действие касания в stacklayout.

person Dean Le    schedule 07.07.2016