我正在使用AS3在Flash CS4中工作。
我有一个TextPage.fla文件,其中包含一个动态文本字段(name:PageTitle)作为舞台上的实例。 在文档类(TextPage)中,我根据一些XML设置了PageTitle的文本。 一切正常。
我有另一个fla文件,SpecialTextPage.fla,并且舞台上还有PageTitle动态文本字段。
我现在尝试将SpecialTextPage文档类继承自Textpage:
public class SpecialTextPage extends TextPage
{
...
}
但是我得到了一个“1120:访问未定义的属性PageTitle。”尝试发布SpecialTextPage时出错。 错误位置以TextPage.as
的形式给出作为一种解决方法,我可以复制整个TextPage.as文件,并在SpecialTextPage.as中添加我需要的额外内容,但如果我可以扩展它,我显然更喜欢它。
我觉得我不太了解舞台上flash对象与文档类之间的关系。
有人可以帮忙吗?
答案 0 :(得分:0)
文档类基本上被取出并转储到SWF的时间轴的第一帧,然后在运行时执行,因此可以访问舞台上的所有内容,就像它们是您班级中的手写属性一样。
现在假设您在SpecialTextPage中创建一个变量,您调用var i:int;无论你做什么,父类都永远不会访问i(也不应该)。同样,舞台元素链接到您的文档类,父级将永远不会访问它们。
类似于MovieClip扩展Sprite,Sprite永远不会引用MovieClips时间轴,因为它没有意识到它。
但并非所有人都失去了!实现目标的一个好方法是拥有以下内容:
/* TextPage */
/* Parent Class */
/* ... */
public function TextPage() {
pageTitle.text = getTitle(); // This textfield would be the one in TextPage.fla
}
protected function getTitle():String {
return "All the text you could ever need in your title";
}
/* ... */
/* SpecialTextPage */
/* Child */
/* ... */
public function SpecialTextPage() {
pageTitle.text = getTitle(); // This textfield would be in SpecialTextPage.fla
}
答案 1 :(得分:0)
解决问题的方法是自动禁用声明阶段实例。 (发布设置 - > Flash标签 - >取消选中'自动声明舞台实例')
然后我需要在我的TextPage类上将pageTitle声明为 public 字段:
public class TextPage extends MovieClip
{
public var pageTitle:TextField;
...
}