Pregunta

Tengo un botón "hecho a mano" (_btn como nombre de instancia), con solo un Dynamictext en el interior (o puedo decir un Dynatictext para cada uno de los cuatro modos de botones). El DynamicText for Up Mode tiene un nombre de instancia de "_text". Entonces, si estoy trabajando en el AS de MOVIECLIP que contiene el botón, ¿cómo puedo abordar el texto del texto dinámico?

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();
        }

    }

}

}

¿Cuál es el problema con mi código?

Access of possibly undefined property _text through a reference with static type flash.display:SimpleButton.
¿Fue útil?

Solución

Cuando crea un símbolo de botón en Flash Professional, el símbolo se convierte en una instancia de SimpleButton. Si desea acceder a los objetos de visualización que ha creado en el símbolo del botón, por ejemplo, Dynamic Textfield, debe acceder a él a través de la SimpleButton objetos upState, overState, downState y hitTestState propiedades.

He creado una función de utilidad que puede incluir en su proyecto para obtener campos de texto dinámicos. La función se llama getDTFFromSB()(Obtenga TextField dinámico de SimpleButton).

La función toma los argumentos simpleButton y state. los simpleButton El argumento es obviamente para el SimpleButton objeto en cuestión y el state El argumento es para especificar qué propiedad estatal (upState,overState,downState y hitTestState) El campo de texto se encuentra encendido con los valores de cadena respectivos: "arriba", "over", "abajo" y "golpear".

La función devuelve un Object objeto que es un TextField objeto, Vector.<TextField objeto o nulo.

Aquí está la función de utilidad 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

También creé un ejemplo de su uso. En la biblioteca tengo un símbolo de botón que exporté para ActionScript. El símbolo del botón tiene un campo de texto dinámico en su estado "arriba" y su text El valor de la propiedad es "A". Aquí está el código en la clase de documento:

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

Cuando creo una nueva instancia del símbolo del botón, llamado _myButton, Lo analizo al getDTFFromSB() función y almacenar el objeto devuelto en un objeto local, llamado returnedObject. Luego uso las declaraciones IF para determinar el tipo de objeto de retorno, y si es un TextField objeto, I store it in a localCampo de textoobject. Now if I trace thetextoproperty of theTextField` Object obtengo "A".

Otros consejos

No se sabe "botón" en este script: si desea crear un botón estándar, use new Button() (con capital b).

Y creo que Button no tiene atributo de texto, sino uno que se llama "etiqueta".

Intenta usar _btn.label.

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();
      }

    }

  }

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top