Seltsamer Skript-UI-Fehler

Ich arbeite an einem Skript mit einem Dialogfeld in Photoshop. Ziel ist es, ein Enddatum und eine Endzeit für mehrere Banner zu erhalten.

Meine Abbrechen-Schaltfläche funktioniert gut, aber meine Ok-Schaltfläche erzeugt einen seltsamen Fehler. Das Fenster scheint sich zu schließen, verschwindet aber einfach. Da es sich um ein Dialogfeld handelt, bleibt Photoshop eingefroren, während es darauf wartet, dass das Dialogfeld geschlossen wird. CMD+Tab zeigt das Fenster an, in das ich klicken kann. Danach - die OK-Schaltfläche schließt das Fenster nicht (der Rest des Codes innerhalb des Rückrufs wird immer noch aufgerufen), aber die Abbrechen-Schaltfläche schließt das Fenster einwandfrei.

(Video, das den Fehler zeigt: https://drive.google.com/open?id=12W6J15ap52xq1jKbVPt2-XeyIxumx6Qd )

Meine Callback-Funktionen sind wie folgt:

var cancelled = false;
dateWin.onClose = function(){
    return cancelled;
}
dateBtnCancel.onClick = function(){
    cancelled = true;
    return dateWin.close();
}
dateBtnOK.onClick = function(){
    cancelled = false;
    return dateWin.close();
}

dateWin.show();
alert(cancelled);

Jede mögliche Unterstützung oder Vorschläge würden geschätzt. Danke schön!

UPDATE Das Deaktivieren meines OnClose-Rückrufs behebt dieses Problem - aber was noch wichtiger ist, ich weiß nicht, warum dies das Problem behebt. Zu verstehen, was hier vor sich geht, kann mir helfen, in Zukunft nicht denselben Fehler zu machen. Wenn Sie also verstehen, warum der onClose-Callback dies verursacht hat, wäre ich für eine Erklärung auf jeden Fall dankbar.

Nur neugierig, warum braucht man so eine Struktur? Wo gibst du deine zurück cancelled? Deinem Video nach zu urteilen brauchst du diese Komplexität nicht
Im obigen Beispiel habe ich wegen eines Fehlers, den ich hatte, einen booleschen Wert als absolutes Minimum verwendet. Aber manchmal gebe ich ein Objekt zurück, das einen abgebrochenen booleschen Wert zusammen mit anderen Daten aus dem Fenster enthält. Der win.onClose()-Callback speichert im Wesentlichen die Daten und gibt sie in einem praktischen Objekt an die Funktion zurück.

Antworten (1)

Ich werde nicht beantworten, warum Sie genau dieses Verhalten erhalten (dies ist wahrscheinlich eine Frage für das Adobe-Skriptforum), aber wenn das Ziel all dessen ist, den cancelledStatus zu erhalten, würde ich vorschlagen, den Code in etwas wie das Folgende zu ändern:

var myUI = showUI();

alert(myUI);

function showUI()
{
    var w = new Window("dialog", "Window Name"),
        dateBtnCancel = w.add('button', undefined, 'Cancel'),
        dateBtnOK = w.add('button', undefined, 'Ok');

    dateBtnOK.onClick = function()
    {
        w.close(1)
    };

    var showWin = w.show();

    if (showWin == 1)
    {
        return true
    }
    else
    {
        return false
    }
    w.close();
};

Wenn Sie ein Dialogfenster abbrechen/schließen, .show()wird zurückgegeben 2, sodass Sie Schaltflächen verwenden können, um ein Fenster mit einem bestimmten Argument zu schließen, .close(arg)um alle benötigten Daten zu erhalten. In meinem Beispiel schließe ich einen Dialog, indem ich 1auf die Schaltfläche OK klicke und später true zurückgebe, wenn er .show()zurückgegeben wird1