Comment puis-je aborder le texte dynamique dans un bouton?
-
26-10-2019 - |
Question
J'ai un bouton « fait main » (de _btn comme nom d'instance), avec seulement l'intérieur DynamicText (ou puis-je dire un dynaticText pour chacun des quatre modes de bouton). Le DynamicText pour le mode Up a un nom d'instance de « _TEXT ». Donc, si je travaille sur l'AS du MovieClip qui contient le bouton, comment puis-je aborder le texte du texte dynamique?
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();
}
}
}
}
Quel est le problème avec mon code?
Access of possibly undefined property _text through a reference with static type flash.display:SimpleButton.
La solution
Lorsque vous créez un symbole de bouton professionnel flash, le symbole devient une instance de SimpleButton
. Si vous souhaitez accéder aux objets d'affichage que vous avez créés dans le symbole de bouton, de dynamique textfield par exemple, vous devez accéder via l'SimpleButton
d'objet upState
, overState
, downState
et propriétés hitTestState
.
J'ai créé une fonction d'utilité que vous pouvez inclure dans votre projet pour obtenir textfields de dynamique. La fonction est appelée getDTFFromSB()
(get textfield dynamique de SimpleButton).
La fonction prend les arguments simpleButton
et state
. L'argument simpleButton
est évidemment pour l'objet SimpleButton
en question, et l'argument state
est pour spécifier que le champ de texte se trouve sur la propriété de l'État (upState
, overState
, downState
et hitTestState
) les valeurs de chaîne respectives: « up », « sur », "down" et "hit".
La fonction retourne un objet Object
qui est soit un objet TextField
, objet Vector.<TextField
ou nulle.
Voici la fonction d'utilité 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
J'ai aussi créé un exemple de son utilisation. Dans la bibliothèque, j'ai un symbole de bouton que je actionscript pour exporté. Le symbole de bouton a une dynamique textfield dans son état « haut » et la valeur de sa propriété text
est « un ». Voici le code dans la classe de document:
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
Quand je crée une nouvelle instance du symbole de bouton, appelé _myButton
, je l'analyse syntaxique à la fonction getDTFFromSB()
et stocker l'objet retourné dans un objet local, appelé returnedObject
. Puis-je utiliser si des déclarations pour déterminer le type de l'objet de retour, et si elle est un TextField
object, I store it in a local
TextFieldobject. Now if I trace the
textproperty of the
TextField` objet que je reçois « a ».
Autres conseils
"bouton" On ne sait pas dans ce script -. Si vous voulez créer un bouton standard, l'utilisation new Button()
(capital B)
et je pense que le bouton n'a pas d'attribut de texte, mais celui qui est appelé « label ».
essayez d'utiliser _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();
}
}
}
}