Использование аргумента массива в JSFL с swfpanel.call
-
28-10-2019 - |
Вопрос
Я пытаюсь создать SWFPanel для Flash CS5.5 с помощью JSFL. Я создал свой интерфейс во вспышке и пытаюсь общаться с командой JSFL. Итак, в моем файле .fla я использую ExternalInterface с обратным вызовом, чтобы вызвать определенную функцию в JSFL, а затем SWFPanel.call () для возврата. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу передать массив в качестве аргумента для функции вызова (после имени функции AS3). Вот код:
В AS3:
function init():void{
ExternalInterface.addCallback("callBackPanel", JsflCallback);
MMExecute("fl.runScript( fl.configURI + \"AirMobileFramework/AirMobileFrameworkPanel.jsfl\", \"checkSettings\" );");
}
function JsflCallback(... args):void{
jsTrace("callback");
}
function jsTrace(str:String):void{
MMExecute("fl.trace(\"" + str + "\");");
}
В JSFL:
function checkSettings(){
var fileSettingsUrl = fl.configURI + "AirMobileFramework/settings.fwk";
var exist = FLfile.exists(fileSettingsUrl);
var result = new Array("settings", exist);
if(!exist){
FLfile.write(fileSettingsUrl, "");
} else {
result.push(FLfile.read(fileSettingsUrl));
}
callPanelBack(result);
}
function callPanelBack(result){
fl.trace("result: " + result.length + " > " + typeof result + " >> " + result[0]);
var panel;
if(fl.swfPanels.length > 0){
for(x = 0; x < fl.swfPanels.length; x++){
if(fl.swfPanels[x].name == "AirMobileFramework"){
panel = fl.swfPanels[x];
panel.call("callBackPanel", result);
break;
}
}
} else {
fl.trace("No existing panel");
}
}
При звонке panel.call ("callbackpanel", результат [0], результат [1]); нет проблем, мой обратный вызов хорошо называется, но при использовании panel.call ("callbackpanel", результат); У меня ошибка:Les Les Erreurs JavaScript Suivantes Se Sont Wreatutes Lors de L'EseCution de AirmobileFramework: La Les Erreur (ы) Javascript suivantes se sont wreaduites:
Есть идеи ??
Решение
Я предполагаю, что это потому, что JSFL не может проанализировать массив. В примере, который вы даете, с результатом [0], результат [1] у вас есть отдельные значения (вероятно, удар или числа), и это не должно дать проблем.
Я бы сделал это:
panel.call("callBackPanel", result.join("@*$");
и в функции AS3 просто Arg.split ("@*$")
Если ваш ввод может иметь строку «@*$», то вы можете просто позвонить в SWF для каждого элемента в результате, и когда вы закончите с петлей, скажите SWF, чтобы собрать вещи - как это :
function callPanelBack(result){
fl.trace("result: " + result.length + " > " + typeof result + " >> " + result[0]);
var panel;
if(fl.swfPanels.length > 0){
for(x = 0; x < fl.swfPanels.length; x++){
if(fl.swfPanels[x].name == "AirMobileFramework"){
panel = fl.swfPanels[x];
panel.call("callBackPanelStart");
for(var i=0; i < result.length; i++){
panel.call("callBackPanelArgument", result[i])
}
panel.call("callBackPanelEnd");
break;
}
}
} else {
fl.trace("No existing panel");
}
}
а затем в AS3:
function callBackPanelStart():void
{
jsflArray = [];
}
function callBackPanelArgument(argument:*):void
{
jsflArray.push(argument);
}
function callBackPanelEnd():void
{
// execute whatever you must on the result
}
Другие советы
Это то, что вам нужно, чтобы пройти массивы туда -сюда из JSFL: http://exanimo.com/actionscript/jsflinterface/
И стоит посмотреть на это, как только он будет выпущен через неделю или около того: http://www.xjsfl.com