2009-08-07 8 views
0

Ich habe dieses bisschen Code, und es funktioniert nicht so, wie ich es erwartet hatte. btnContainer ist eine VBox, die eine Menge Buttons enthält (toggle = true); und ich möchte sie an einem bestimmten Punkt auf un-getoggelt zurücksetzen.Flex 3: Wie stelle ich fest, ob ein generisches Objekt tatsächlich eine Schaltfläche ist?

for (var btn:Object in btnContainer.getChildren()){ 
    if (btn.isPrototypeOf(mx.controls.Button)){ 
     btn.selected = false; 
    } 
} 

Mit dem obigen Code „BTN“ zeigt während jeder Iteration der Schleife, als nur den Index nach oben (0,1,2,3, ...), und die bedingten wertet nie wahr.

Ich habe auch versucht dies:

for (var btn:Button in btnContainer.getChildren()){ 
    btn.selected = false; 
} 

Dies funktioniert gut, außer, dass es auch ein Etikett im btnContainer; Es wird also ein Fehler ausgegeben, wenn das Label als Schaltfläche gecastet wird.

Was mache ich hier falsch?

Antwort

4

Wenn Sie durch die Elemente eines Arrays in einer Schleife, verwenden Sie eine „for each..in“ Schleife, und wenn Sie möchten, um zu sehen, ob eine Variable mit einem bestimmten Typ (zB eine Instanz einer bestimmten Klasse) kompatibel ist Verwenden Sie den Operator is.

Die Sprachreferenz hat an example für diese genaue Art von Fall.

Hier ist der feste Code:

for each (var btn:Object in btnContainer.getChildren()){ 
    if (btn is Button){ 
     btn.selected = false; 
    } 
} 
+0

Ah, ich hatte den „jeden“ Teil fällt gelassen, weil ich ein Gehirn Furz hatte und dachte, es optional war. Machen Sie Sinn, danke. –

+0

ohne das "each" bedeutet es etwas anderes: es wird über die Eigenschaften des Elements iterieren, eine Art Typ-Introspektion (könnte manchmal nützlich sein). –

2

Haben Sie versucht, is zu verwenden?

import mx.controls.Button; 

//... 
for (var key in btnContainer.getChildren()){ 
    var obj : Object = btnContainer[key]; 
    if (obj is Button){ 
     var button : Button = obj as Button; 
     button.selected = false; 
    } 
} 
Verwandte Themen