Adobe AIR,IOS和多个SWF - 返回先前加载的SWF

时间:2013-11-18 03:03:21

标签: ios actionscript-3 flash air

我正在使用Adobe AIR,Flash和ActionScript 3开发IOS应用程序,我将各个部分划分为单独的SWF文件。我已成功获得应用程序以加载外部SWF并使用以下代码执行其ActionScript:

var proloader:ProLoader = new ProLoader();
proloader.load(new URLRequest("file.swf"), new LoaderContext(false, ApplicationDomain.currentDomain, null));
addChild(proloader);

现在,我想添加一个重置按钮,允许用户从任何其他SWF文件返回到第一个SWF的开头,以重新启动应用程序。不幸的是,似乎每当我尝试加载以前加载过的SWF时,都没有任何反应。我已经读过在IOS上不允许卸载和重新加载SWF,而且你在IOS上只限于一个ApplicationDomain这一事实使事情变得困难。但是,我仍然认为必须有一些解决方法。如果这是唯一的方法,我可以不卸载外部SWF,但我仍然无法找到返回之前加载的SWF的方法。

有没有人知道如何返回之前使用Adobe Air在IOS中加载的SWF?

2 个答案:

答案 0 :(得分:0)

你可以拥有一个充当缓存的静态类。

缓存可能看起来像我为菜单系统做的那样:

package com.rs2014.managers {     import flash.display.MovieClip;     import flash.utils.Dictionary;     import flash.events.Event;     import flash.events.EventDispatcher;

import com.events.MenuManagerEvent;
import com.menus.MenuBase;
import com.components.MenuLoader;
import com.MenuIdents;


public class MenuManager extends EventDispatcher
{

    private static var instance:MenuManager
    private static var allowInstantiation:Boolean = true;

    public static function getInstance():MenuManager
    {
        if(!instance)
        {
            instance = new MenuManager();
            allowInstantiation = false;
        }

        return instance
    }

    private const MAX_MENUS:uint = 8;

    private var menuCache:Dictionary = new Dictionary()

    public function MenuManager()
    {
        if(!allowInstantiation)
        {
            throw(new Error("please use the getInstance() method to obtain a handle to this singleton"));
        }
    }

    public function getMenu(menu:String):void
    {
        if(menuCache[menu])
        {
            //This pulls from the cache if it's already been loaded before
            dispatchMenu(null, menuCache[menu]);
        }
        else
        {
            //MenuLoader is a simple wrapper for Loader
            var newLoader:MenuLoader = new MenuLoader();
            menuCache[menu] = newLoader;
            newLoader.addEventListener(Event.COMPLETE, dispatchMenu);
            newLoader.source = menu;
            //trace("setting up loader with source = "+menu);
        }
    }

    private function dispatchMenu(e:Event = null, menu:MenuBase = null):void
    {
        if(e)
        {
            e.target.removeEventListener(Event.COMPLETE, dispatchMenu);
            //trace(e.target.content);
            //trace(e.target.content as MenuBase);
            menuCache[e.target.source] = menu = e.target.content as MenuBase;
            //trace(menu);

        }

        if(!menu)
        {
            throw(new Error("MenuManager Error: dispatchMenu called without menu to dispatch"));
        }
        this.dispatchEvent(new MenuManagerEvent(MenuManagerEvent.MENU_READY, menu))

    }



}

}

答案 1 :(得分:0)

我能够解决重新加载SWF没有ABC的问题(没有代码!),我在我的博客(http://www.eqsim.com/blog/?p=400)上解释了这一切,但也简单地在StackOverflow上给出了代码:{{3} } wf-in-air-for-ios / 22046009#22046009

现在Adobe有一个解决方案,用于从SWF中分离代码,并在外部加载SWF。但是,我们在AIR 3.5之前通过仅为代码创建类,然后加载SWF并在代码类中设置指向加载的SWF的链接来解决它。当我们需要更新到4.0时,SWF重新加载,甚至是纯SWF资产,并不是在所有情况下都能正常工作,所以我们插上去寻找上面引用的解决方案。