0

我创建了一个自定义事件,我想用它在两个模块之间传递一个字符串。事件如下所示:

package com.mypackage.events
{
import flash.events.Event;

public class ThumbDeleteEvent extends Event
{
    public static const THUMBS_DELETED:String = "thumbsDeleted";

    public var files:String;

    public function ThumbDeleteEvent(type:String, files:String)
    {
    super(type);
    this.files = files;
    }

    // Override the inherited clone() method.
    override public function clone():Event {
    return new ThumbDeleteEvent(type, files);
    }

}
}

在一个模块中,我像这样发送事件:

parentApplication.dispatchEvent(new ThumbDeleteEvent("parentApplication.thumbsDeleted", files));

在另一个模块中,我像这样监听事件:

public function init():void {
    parentApplication.addEventListener("parentApplication.thumbsDeleted", onThumbsDelete);
    }

如果我使用 ThumbsDeleteEvent 作为传入侦听器函数的类型,如下所示:

public function onThumbsDelete(evt:ThumbDeleteEvent):void{
 trace("thumb delete event for thumbs: "+evt.files);
}

我收到以下错误:

TypeError: Error #1034: Type Coercion failed: cannot convert  com.mypackage.events::ThumbDeleteEvent@26748a31 to com.mypackage.events.ThumbDeleteEvent.

如果我只是使用 Event 作为传入侦听器函数的类型,如下所示:

public function onThumbsDelete(evt:ThumbDeleteEvent):void{
if(evt is ThumbDeleteEvent){
    trace("thumb delete event for thumbs: "+(evt as ThumbDeleteEvent).files);
}else{
    var type:XML = describeType(evt);
    trace(type.toXMLString());
}
}

它工作但不认为它是 ThumbDeleteEvent 类型类(它命中 else 语句)描述类型的 xml 输出说它的类型是:

type name="com.mypackage.events::ThumbDeleteEvent" 

这里发生了什么?如果我在调试器中放置断点,它会说事件是 ThumbDeleteEvent,我可以看到 files 参数及其正确的???

4

1 回答 1

1

这里的问题是,一个 swf 有他们对该类的定义,而另一个 swf 有自己的版本,该类完全相同。当尝试在它们之间进行转换时,flash 会进行字节码检查以查看定义是否相同,如果您曾经在文件中更改了某些内容而没有使用完全相同的信息更新两者,您将遇到此问题。即编译两个swf文件,然后在as文件中换一个空格,只编译一个swf文件。

呃,它又回到了我身边,所有这些问题都与不同模块之间的共享代码有关。我总是不停地解决这些错误,直到我让它工作,并且永远无法真正记住它是什么,因为它可能是很多问题。

  • 确保两个已编译的 swf 文件都具有文件的最新版本。
  • 确保两个 swf 文件与代码文件具有相同的链接嵌套。

如果这不起作用[无法真正记住,因为这个问题有点像解决一次并复制到其他每个项目]。

  • 查看将事物添加到 ApplicationDomain 的顺序,并通过在 Flash 库中导入的内容确保没有其他内容具有自己的过期版本
  • 将共享代码移动到使用“动态绑定”链接的单独代码库中
  • 尝试共享界面
  • 更改资产加载到 ApplicationDomain 的方式

希望有人对这个问题有更多的了解,并且可以准确地说明要使用哪些步骤,但这至少是一个起点......我可能有更多的时间来研究这个问题,并在今天晚些时候的某个时候写一篇关于它的帖子。


编辑:从另一个 SO-thread自定义 AS3 类未更新

这是一个古老的问题,最终归结为验证错误。当您在一个或多个应用程序、模块、swf 等中嵌入“A 类”时,就会发生这种情况。最终,当“A 类”更改时,必须重新编译使用“A 类”的每个输出 swf。否则,您最终会遇到 1 个模块具有较新实现而其他模块没有的情况。当应用程序域遇到同名/包的类时,应用程序域被定义为“第一个获胜”,这使这个问题变得更加复杂——这意味着如果首先引用旧的,那么稍后加载的新的将被忽略。

更持久的解决方案是对 RSL 使用类提升,最终允许 RSL 控制实际的“A 类”引用,其中它还实现所有模块使用的“IClassAImpl”接口。这允许编译器将引用与它知道的签名交叉链接,而无需实际嵌入实际的类本身。

于 2012-12-11T15:23:27.677 回答