2016-03-30 5 views
0

Ich habe folgendes Setup: In Label.fla gibt es einen MovieClip, der ein TextField enthält, dessen Klasse auf src.components.Label gesetzt ist. Bei dieser Klasse wird die Schriftart im Konstruktor festgelegt und dann die text -Eigenschaft des TextField auf eine leere Zeichenfolge gesetzt (der Wert der Zeichenfolge spielt für dieses Problem keine Rolle. Sie kann eine nicht leere Zeichenfolge sein und dieselbe haben Ergebnis). Wie folgt aus:AS3 - Warum wird die Schriftart gelöscht, nachdem Text eines TextFields gesetzt wurde?

package src.components 
{ 
    import flash.display.MovieClip; 
    import flash.text.TextFormat; 
    import flash.text.TextField; 

    public class Label extends MovieClip 
    { 
     public var mTextField:TextField; 

     public function Label() 
     { 
      super(); 

      var tf:TextFormat = new TextFormat("Arial", 34, 0xFFFFFF); 
      mTextField.defaultTextFormat = tf; 
      mTextField.setTextFormat(tf); 

      trace("init before: " + mTextField.getTextFormat().font); 
      mTextField.text = ""; 
      trace("init after: " + mTextField.getTextFormat().font); 
     } 
    } 
} 

Das Label Objekt in Label.fla eingerichtet ist für Runtime-Sharing zu exportieren, die in MainMenu.fla kopiert wurde. Eine einzelne Instanz dieses Labels wird auf der Bühne von MainMenu.fla platziert, und wenn ich MainMenu.swf ausführe, zeigt die Ausgabe eindeutig, dass die Schriftart gesetzt und dann sofort gelöscht wird, nur weil ich die Text-Eigenschaft des TextFields ändere.

Die Ausgabe sieht wie folgt aus:

init before: Arial 
init after: null 

Warum sollte die Einstellung der Text verursachen die Schriftart gelöscht werden? Das verursacht mir viele Probleme. Die einzige Möglichkeit, wie ich das umgehen kann, ist, etwas Dummes zu tun, wo ich eine Kopie des TextFormat-Objekts anlege, bevor ich den Text setze, den Text setze und dann das kopierte TextFormat erneut anwende, um sicherzustellen, dass es sich nicht ändert .

Ich habe eine Zip-Datei angehängt, die alle Quell- und kompilierten Dateien enthält, um dies zu testen. FontTest.zip

Antwort

2

Die sehr kurze Antwort auf die Frage lautet:

  • , weil Sie nicht die Dokumentation gelesen haben.

Das ist richtig, das ist das einzige Problem in Ihrem Code. Sie verwenden eine Methode (setTextFormat (tf)), die nur das Format für den aktuellen vorhandenen Text festlegen soll. Dies ist natürlich in den Dokumenten angegeben.

Die eine Methode, die das Format für alle zukünftigen Texte festlegt, ist: "defaultTextFormat". Auch dies ist in den Dokumenten festgelegt und diese Methode wird keinen Text ändern, der bereits im Textfeld festgelegt ist.

Also 2 Methoden für 2 verschiedene Dinge, eine (die Sie verwenden), die verwendet wird, um den vorhandenen Text zu ändern, und eine "defaultTextFormat", die verwendet wird, um zukünftige Texte zu ändern.

Aber das Lesen der Dokumente hätte Ihnen eine Reise nach SO erspart, lesen Sie die As3-Dokumentation und beantworten 99% Ihrer zukünftigen Fragen und Probleme.

+0

Ich verstehe nicht 100% wie standardTextFormat funktioniert auch mit der Dokumentation. Ich stelle es ein, also würde ich erwarten, dass es es nach dem Ändern des Textes anwenden würde. Obwohl es nach dem erneuten Lesen der Dokumente nur replaceSelectedText() und setSelection() erwähnt, funktionieren vielleicht nur diese beiden Funktionen? Ich werde damit herumspielen müssen mehr ... – Shenjoku

1

Erweitern von dem, was BotMaster gepostet hat, lese ich die Dokumentation noch einmal durch und finde heraus, wo ich falsch verstanden habe. Sie können nur setzen Sie den Text mit setSelection() gefolgt von replaceSelectedText(), wenn Sie die Textformatierung bei der Verwendung von DefaultTextFormat beibehalten möchten. So ist der festen Konstruktor sieht wie folgt aus:

public function Label() 
{ 
    super(); 

    var tf:TextFormat = new TextFormat("Arial", 34, 0xFFFFFF); 
    mTextField.defaultTextFormat = tf; 

    trace("init before: " + mTextField.getTextFormat().font); 
    mTextField.setSelection(0, mTextField.length); 
    mTextField.replaceSelectedText(""); 
    trace("init after: " + mTextField.getTextFormat().font); 
} 

Dies erzeugt die folgende Ausgabe:

init before: Bender 
init after: Arial 

Bender ist die Schriftart in der FLA eingestellt werden, so dass die erwartete Startwert ist.

Als eine alternative Lösung könnten Sie das TextFormat-Objekt speichern und es nur anwenden, nachdem Sie die Texteigenschaft festgelegt haben, aber ich bin mir nicht sicher, welche effizienter ist. Diese Lösung würde so aussehen:

public class Label extends MovieClip 
{ 
    public var mTextField:TextField; 
    private var mTextFormat:TextFormat = null; 

    public function Label() 
    { 
     super(); 

     // Storing this in a member so that anywhere in this class that you change the text 
     // you can just apply it without having to reconstructing it. 
     mTextFormat = new TextFormat("Arial", 34, 0xFFFFFF); 

     trace("init before: " + mTextField.getTextFormat().font); 
     mTextField.text = ""; 
     mTextField.setTextFormat(mTextFormat); 
     trace("init after: " + mTextField.getTextFormat().font); 
    } 
} 
+0

Ich bin verwirrt ... wenn Sie 'mTextField.defaultTextFormat = tf;' mit Arial Schriftart, dann warum würde es Bender verfolgen, wenn Sie tun, "Trace ("init before:" ... aber ich denke, dass du ein altes Problem für mich gelöst hast. Ich erstelle TextFields immer nach Code, weil es das Textformat nicht aktualisieren würde, wenn es bereits auf der Bühne wäre (erzeugt durch das "Text" -Symbol) der funktionierende Trick ist 'replaceSelectedText (" ");' Dies könnte sogar ein Flash-Bug sein. Ich werde die Dinge später überprüfen ... –

+0

Es gibt Bender aus, weil die Einstellung defaultTextFormat das Format nicht auf den vorhandenen Text anwendet wende es an, bis ich replaceSelectedText() anrufe. – Shenjoku

+0

Der Code wurde von der ursprünglichen Frage geändert, indem defaultTextFormat keine Formatierung auf den zuvor gesetzten Text anwendet, sondern Formatierung auf den nach AFTER gesetzten Text anwendet, wobei setTextFormat funktioniert der genaue umgekehrte Weg. – BotMaster

Verwandte Themen