我在Flash中创建了一个按钮,在里面我有一个TextField和一个MovieClip,两者都设置了实例名称。它们覆盖按钮的所有4个框架,没有关键帧。
我发现无法使用我设置的实例名称访问对象,所以我使用这段代码来查看发生了什么:
var obj:DisplayObject = this.m_graphics.btnChange.upState;
for ( var i:int = 0; i < obj.numChildren; i++ )
{
trace( "We have an object at " + i + " - " + obj.getChildAt( i ) + ": " + obj.getChildAt( i ).name );
var t:TextField = obj.getChildAt( i ) as TextField;
if ( t == null )
continue;
trace( " The textfield has text '" + t.text + "' );
}
我得到这个作为输出:
We have an object at 0 - [object Shape]: instance195
We have an object at 1 - [object TextField]: instance199
The textfield has text 'Change'
We have an object at 2 - [object MovieClip]: instance203
所以他们有TextField和MovieClip,他们只是将他们的实例名称重置为通用的“instance ###”。
任何人都知道问题是什么?如果我使按钮成为MovieClip,它工作正常(虽然我必须自己控制帧)。
我知道可以用来解决这个问题的不同方法,但这意味着要改变很多东西,我想知道为什么SimpleButton会忽略Flash中设置的实例名称
修改
进一步研究,似乎即使Flash IDE中的按钮中没有关键帧,Flash也会为每个项创建4个实例(例如,通过upState
进行跟踪会给我一个{{ 1}}实例名称为“instance2”,而在TextField
中,实例名称为“instance4”)。如果我在一个状态下更改文本,则不会反映在其他状态中。
我在想,当Flash创建对象时,它不会正确复制所有属性(即实例名称)
修改
我同意Shane的答案是一种解决方法 - 我自己说过我知道解决这个问题的不同方法 - 但它忽略了问题,它没有解决它(这是我唯一的原因)没有接受它)。我首先来到SO,看看是否有人知道为什么它首先发生(tbh,它似乎是SDK中的一个错误)。
我也理解“你不应该在SimpleButton中访问子项;如果你想要更多控制,使用Sprite或MovieClip”的论证背后的原因,但我不同意。 Flash IDE允许您创建其中包含命名实例的按钮,而SimpleButton文档允许您访问不同的状态,因此对我来说,这是可接受的行为。如果SimpleButton只能用于非常基本的,不可更改的静态按钮(也可以考虑本地化),那么它就没用了。你可以使用Sprite和MovieClip,但是你必须自己控制不同的状态,这会变得很尴尬。我有自己的Button类来处理样板,但我不应该重写基本的SDK功能,这就是为什么对我来说这是一个错误。
我将保持赏金开放的时间。如果我什么也得不到,那么我会把它交给谢恩。
答案 0 :(得分:5)
这是因为flash.display.SimpleButton类不从DisplayObjectContainer
继承,并且状态容器也不是DisplayObjectContainers:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/SimpleButton.html
基本上,简单按钮的定义很简单。如果你想对内部对象进行更复杂的控制,你必须使用一个Sprite或MovieClip,并将buttonMode设置为true。