Как я могу обратиться к динамическому тексту внутри кнопки? - PullRequest
0 голосов
/ 25 июля 2011

У меня есть кнопка «handmade» (_btn в качестве имени экземпляра), внутри которой находится только динамический текст (или я могу сказать один dynaticText для каждого из четырех режимов кнопок).Динамический текст для режима Up имеет имя экземпляра "_text".Поэтому, если я работаю с AS для мувиклипа, содержащего кнопку, как я могу обратиться к тексту динамического текста?

package  {
import flash.display.MovieClip;
import flash.display.SimpleButton;

public class container extends MovieClip {
    var _btn:button;

    public function container() {
        _btn= new button;
        this.addChild(_btn);
        switch (_btn._text.text)
        {
            case "a": doAFunction();
            case "b": doBFunction();
            case "c": doCFunction();
        }

    }

}

}

В чем проблема с моим кодом?

Access of possibly undefined property _text through a reference with static type flash.display:SimpleButton.

Ответы [ 3 ]

1 голос
/ 26 июля 2011

Когда вы создаете символ кнопки во Flash Professional, этот символ становится экземпляром SimpleButton.Если вы хотите получить доступ к экранным объектам, которые вы создали в символе кнопки, например, к динамическому текстовому полю, вы должны получить к нему доступ через свойства upState объекта *1003*, overState, downState и hitTestState.

Я создал вспомогательную функцию, которую вы можете включить в свой проект для получения динамических текстовых полей.Функция называется getDTFFromSB() (получить динамическое текстовое поле из простой кнопки).

Функция принимает аргументы simpleButton и state.Аргумент simpleButton, очевидно, предназначен для рассматриваемого объекта SimpleButton, а аргумент state предназначен для указания, какое свойство состояния (upState, overState, downState и hitTestState) находится в текстовом поле.с соответствующими строковыми значениями: «вверх», «над», «вниз» и «удар».

Функция возвращает объект Object, который является либо TextField объектом, Vector.<TextField объектом или нулем.

Вот служебная функция getDTFFromSB ():

package utils
{
    import flash.display.DisplayObject;
    import flash.display.DisplayObjectContainer;
    import flash.display.SimpleButton;
    import flash.text.TextField;

    /**
     * get dynamic textfield from simple button
     */
    public function getDTFFromSB(simpleButton:SimpleButton, state:String = "up"):Object
    {
        var returnObject:Object;

        var displayObject:DisplayObject;

        switch(state)
        {
            case "up" : displayObject = simpleButton.upState;
            case "over" : displayObject = simpleButton.overState;
            case "down" : displayObject = simpleButton.downState;
            case "hit" : displayObject = simpleButton.hitTestState;

        }// end switch

        if(displayObject is TextField)
        {
            returnObject = displayObject;
        }
        else if(displayObject is DisplayObjectContainer)
        {
            var doc:DisplayObjectContainer = displayObject as DisplayObjectContainer;
            var textFields:Vector.<TextField> = new Vector.<TextField>();

            for(var i:uint = 0; i < doc.numChildren; i++)
            {
                if(doc.getChildAt(i) is TextField) 
                textFields.push(doc.getChildAt(i));

            }// end for

            if(textFields.length == 0) returnObject = null
            else if(textFields.length == 1) returnObject = textFields[0]
            else if(textFields.length > 1) returnObject = textFields;

        }
        else
        {
            returnObject = null;

        }// end else

        return returnObject;

    }// end function

}// end package

Я также создал пример его использования.В библиотеке у меня есть символ кнопки, который я экспортировал для actioncript.Символ кнопки имеет одно динамическое текстовое поле в состоянии «вверх», а значение его свойства text равно «а».Вот код в классе документа:

package
{
    import utils.getDTFFromSB;
    import flash.display.SimpleButton;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.text.TextField;

    public class Main extends Sprite
    {
        private var _myButton:SimpleButton;

        public function Main()
        {
            if(stage) init()
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            _myButton = new MyButton();
            addChild(_myButton);

            var returnedObject:Object = getDTFFromSB(_myButton);

            var textField:TextField;

            if(returnedObject is TextField)
            {
                textField = TextField(returnedObject);

            }
            else if(returnedObject is Vector.<TextField>)
            {
                textField = Vector.<TextField>(returnedObject)[0];

            }
            else if(returnedObject == null)
            {
                throw new Error("null value returned from getDTFFromSB() method");

            }// end if

            trace(textField.text) // ouput: a

        }// end function

    }// end class

}// end package

Когда я создаю новый экземпляр символа кнопки с именем _myButton, я анализирую его в функции getDTFFromSB() и сохраняю возвращенный объект влокальный объект, называемый returnedObject.Затем я использую операторы if, чтобы определить тип возвращаемого объекта, и если это объект TextField object , I store it in a local TextField object. Now if I trace the text property of the TextField`, я получаю "a".

0 голосов
/ 25 июля 2011
package  {
  import flash.display.MovieClip;
  //import flash.display.SimpleButton;
  import fl.controls.Button

  public class container extends MovieClip {
    var _btn:button;
    public function container() {
      _btn= new button;
      this.addChild(_btn);
      switch (_btn.label)
      // switch (_btn._text.text)
      {
          case "a": doAFunction();
          case "b": doBFunction();
          case "c": doCFunction();
      }

    }

  }

}
0 голосов
/ 25 июля 2011

«кнопка» в этом сценарии не известна - если вы хотите создать стандартную кнопку, используйте new Button() (с большой буквы).

, и я думаю, что у Баттона нет текстового атрибута, но он называется"label".

попробуйте использовать _btn.label.

...