¿Cómo puedo abordar el texto dinámico dentro de un trasero?
-
26-10-2019 - |
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.
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 local
Campo de textoobject. Now if I trace the
textoproperty of the
TextField` 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();
}
}
}
}