Domanda

Ho un pulsante "artigianale" (_btn come nome esempio), con solo all'interno DynamicText (o posso dire una dynaticText per ciascuna delle quattro modalità pulsante). Il DynamicText per la modalità Up ha un nome di "_text" istanza. Quindi, se sto lavorando sulla AS della MovieClip che contiene il pulsante, come posso affrontare il testo del testo dinamico?

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

    }

}

}

Qual è il problema con il mio codice?

Access of possibly undefined property _text through a reference with static type flash.display:SimpleButton.
È stato utile?

Soluzione

Quando create un simbolo di pulsante in Flash Professional, il simbolo diventa un'istanza di SimpleButton. Se si desidera accedere gli oggetti di visualizzazione che hai creato nel simbolo del pulsante, per esempio dinamica textfield, è necessario accedervi tramite le proprietà SimpleButton, upState, overState e downState dell'oggetto hitTestState.

Ho creato una funzione di utilità che è possibile includere nel progetto per ottenere textfields dinamici. La funzione viene chiamata getDTFFromSB() (ottenere textfield dinamico dal SimpleButton).

La funzione prende il simpleButton argomenti e state. L'argomento simpleButton è ovviamente per l'oggetto SimpleButton in questione, e l'argomento state è per specificare quali proprietà statale (upState, overState, downState e hitTestState) il campo di testo si trova con i rispettivi valori di stringa: "up", "over", "down" e "hit".

La funzione restituisce un oggetto Object che è o un oggetto TextField, oggetto Vector.<TextField o nullo.

Questa è la funzione di 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

Ho anche creato un esempio del suo utilizzo. Nella biblioteca ho un simbolo di pulsante che ho esportato per ActionScript. Il simbolo del tasto ha un campo di testo dinamico nel suo stato "up" e il valore della sua proprietà text è "a". Ecco il codice nella classe 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

Quando creo una nuova istanza del simbolo di pulsante, chiamato _myButton, ho analizzarlo alla funzione getDTFFromSB() e memorizzare l'oggetto restituito in un oggetto locale, chiamato returnedObject. Poi io uso if per determinare il tipo di oggetto di ritorno, e se si tratta di un TextField object, I store it in a localTextFieldobject. Now if I trace thetextproperty of theTextField` oppongo ottengo "a".

Altri suggerimenti

"pulsante" non è noto in questo script -. Se si desidera creare un pulsante standard, uso new Button() (con capitale B)

e penso pulsante non ha alcun attributo di testo, ma uno che si chiama "etichetta".

provare a utilizzare _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();
      }

    }

  }

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top