Wie kann ich dynamischen Text in einem Buttom ansprechen?
-
26-10-2019 - |
Frage
Ich habe eine "handgefertigte" Taste (_BTN als Instanzname), mit nur einem DynamiciCtext (oder kann ich für jeden der vier Tastenmodi sagen). Der DynamiciCtext für UP -Modus hat einen Instanznamen "_text". Wenn ich also an dem MovieClip arbeite, der die Schaltfläche enthält, wie kann ich dann den Text des dynamischen Textes ansprechen?
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();
}
}
}
}
Was ist das Problem mit meinem Code?
Access of possibly undefined property _text through a reference with static type flash.display:SimpleButton.
Lösung
Wenn Sie ein Schaltflächensymbol in Flash Professional erstellen, wird das Symbol zu einer Instanz von SimpleButton
. Wenn Sie auf die Anzeigeobjekte zugreifen möchten, die Sie im Schaltflächensymbol, z. B. dynamisches Textfeld, erstellt haben, müssen Sie über die über die darauf zugreifen SimpleButton
Objekt upState
, overState
, downState
und hitTestState
Eigenschaften.
Ich habe eine Versorgungsfunktion erstellt, die Sie in Ihr Projekt aufnehmen können, um dynamische Textfelder zu erhalten. Die Funktion heißt getDTFFromSB()
(Holen Sie sich dynamisches Textfeld von SimpleButton).
Die Funktion nimmt die Argumente an simpleButton
und state
. Das simpleButton
Argument ist offensichtlich für die SimpleButton
fragliche Objekt und die state
Argument dient zur Angabe der staatlichen Eigenschaft (upState
,overState
,downState
und hitTestState
) Das Textfeld befindet sich mit den jeweiligen Zeichenfolgenwerten: "Up", "Over", "Down" und "Hit".
Die Funktion gibt eine zurück Object
Objekt, das entweder a ist TextField
Objekt, Vector.<TextField
Objekt oder Null.
Hier ist die Dienstprogrammfunktion 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
Ich habe auch ein Beispiel für die Verwendung erstellt. In der Bibliothek habe ich ein Knopfsymbol, das ich für ActionScript exportierte. Das Schaltflächensymbol hat ein dynamisches Textfeld in seinem "Up" -Zustand und dessen text
Der Wert der Eigenschaft ist "a". Hier ist der Code in der Dokumentklasse:
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
Wenn ich eine neue Instanz des Schaltflächensymbols erstelle, aufgerufen _myButton
, Ich analyse es dem getDTFFromSB()
Funktion und speichern Sie das zurückgegebene Objekt in einem lokalen Objekt, das genannt wird returnedObject
. Dann benutze ich, ob Anweisungen den Typ des Rückkehrobjekts bestimmen und ob es a ist TextField
Objekt, I store it in a local
Textfeldobject. Now if I trace the
Textproperty of the
Textfield` Objekt Ich bekomme "a".
Andere Tipps
"Button" ist in diesem Skript nicht bekannt. Wenn Sie eine Standard -Taste erstellen möchten, verwenden Sie new Button()
(mit Kapital b).
Und ich denke, die Schaltfläche hat kein Textattribut außer einem "Label".
Versuchen Sie es zu verwenden _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();
}
}
}
}