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.
War es hilfreich?

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 localTextfeldobject. Now if I trace theTextproperty of theTextfield` 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();
      }

    }

  }

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top