【问题标题】:As3 Referencing a class from timelineAs3 从时间轴中引用一个类
【发布时间】:2011-12-10 07:13:33
【问题描述】:

我不知道发生了什么?我可以将其他类导入时间线并很好地使用它们,但是这个类给我带来了重大问题?我正在解析来自我的服务器的 XML 数据,它给了我看起来像这样的错误。

时间线参考及用法:

     import networkScores;

     var network:networkScores = new networkScores();
     addChild(network);

     score1Textfield.text = network.score1.toString();

类定义:

 package 
 {
          import flash.net.URLLoader;
          import flash.net.URLRequest;
          import flash.events.Event;
          import flash.display.MovieClip;

         public class networkScores extends MovieClip
         {
                 public var myXML:XML, myXMLNames:XML;
                 public var xmlLoaderScores = new URLLoader();
                 public var score1:int;

                 public function networkScores()
                 {
                     xmlLoaderScores.addEventListener(
                                Event.COMPLETE, xmlLoadedScores);
                     xmlLoaderScores.load(new URLRequest("pathtoxmlfile"));
                 }

                 public function xmlLoadedScores(e:Event):void
                 {
                      myXML = new XML(e.target.data);
                      var qName1:QName = new QName(
                            "http://www.w3.org/2005/Atom", "score1");
                      score1 = myXML.descendants(qName1)[0].toString();
                 }
            
        }

     }

我得到的错误:

场景 1,“Actions”层,第 4 帧,第 149 行 1119:通过静态类型 networkScores 的引用访问可能未定义的属性 score1。

1067:将 networkScores 类型的值隐式强制转换为不相关的类型 flash.display:DisplayObject。

这是一个选角问题吗?

我该如何解决这个问题?

【问题讨论】:

  • 你能告诉我哪一行出错了吗?
  • 对不起,是的,addChild(network);行收到 1067 错误,并且 network.score1.toString();行收到 1119 错误。
  • 您的代码看起来不错,我认为flash 找不到类networkScores 的定义。 networkScores.as 文件在哪里?
  • 网络分数文件与我的 .xfl 文件位于同一目录中
  • @Scientific xfl 文件?我只使用过 fla 和 mxml 文件。和fla一样吗?

标签: android flash actionscript-3 adobe


【解决方案1】:

您的时间线不应该试图引用文档类。文档类应该控制一切。有几种方法可以知道对象何时已添加到阶段并准备好处理(例如侦听已添加到阶段)。一旦您知道该对象已被添加并且您知道您的 xml 已返回,您就可以在您在 its 文档类中公开的子对象上填充一个变量.有关这方面的更多信息,请查看此博客文章 http://www.developria.com/2010/04/combining-the-timeline-with-oo.html 以及此处的随附代码 http://flexdiary.blogspot.com/2010/04/sample-code-for-oop-timeline-insideria.html

编辑显示代码:

它的代码可能如下所示:

package {
   public class Main extends MovieClip {
      private var _stageInstance:StageInstance;
      private var _score:String;
      private var _loader:URLLoader;//hold loader in memory so it doesn't gc before it returns
      //by using a getter/setter pair, we know when Flash has added the instance to the stage
      public function get stageInstance():StageInstance{
          return _stageInstance;
      }
      public function set stageInstance(value:StageInstance):void {
         _stageInstance = value;
         if (_stageInstance != null && _score != null) {
             _stageInstance.score = _score;
         }
      }
      public function onScoreLoaded(e:Event):void {
         myXML = new XML(e.target.data);
         var qName1:QName = new QName("http://www.w3.org/2005/Atom", "score1");
         _score = myXML.descendants(qName1)[0].toString();
         if (stageInstance != null) {
            stageInstance.score = _score;
         }
      }
      public function Main() {
         _loader = new URLLoader();
         _loader.addEventListener(Event.COMPLETE, onScoreLoaded);
         _loader.load(new URLRequest('pathToXML'));
      }
   }

}

package {
   public Class StageInstance extends MovieClip {
       pubic var score1TextField:TextField;//populated by Flash Player
       private vare _score:String;
       //note how the setter here is doing something useful, not just passing through the value
       public function get score():String {
          return _score;
       }
       public function set score(value:String):void {
          _score=value;
          score1TextField.text=score;
       }
       public function StageInstance() {
          super();
       }

   }

}

【讨论】:

  • 对,但是主文档类应该是编排数据类和时间线类的关系。时间线对象不应尝试处理此问题。
  • 是的。有两种类型的开发人员,一种是关心最佳实践的类型,另一种是关心让它以某种方式工作的类型。我倾向于假设,如果您在 StackOverflow 之类的论坛上提问,您至少想知道最佳实践是什么。
  • 您好,感谢大家的意见。就像 AsTheWormTurns 所说的那样,我并没有尝试将 networkScores.as 文件作为我的库中的链接类标识符来引用,而只是从时间轴中引用。我以前见过以这种方式引用的类,也见过以 Amy 所说的方式引用的类。我不知道哪个是正确的,并假设我可以使用这两种方法。感谢科学
  • @Sceintific:是的,您会看到执行各种不良做法的文件。问题是,AS2 迫使开发人员养成了很多坏习惯,其中许多还没有恢复。新开发人员看到他们所做的事情(并在 sn-ps 功能的指导下),会直接进入坏习惯,甚至没有意识到发生了什么。
  • 大家好,抱歉耽搁了,但非常感谢您的帮助!我现在使用 Amy 描述的文档类系统设置我的项目,它现在可以正常工作。我肯定是那些在学习不良实践方面做得很好的开发人员之一。再次感谢科学
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多