div*_*ges 5 flash actionscript-3 textfield
我在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 + "' );
}
Run Code Online (Sandbox Code Playgroud)
我得到这个作为输出:
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
Run Code Online (Sandbox Code Playgroud)
所以他们有TextField和MovieClip,他们只是将他们的实例名称重置为通用"实例###".
谁知道问题是什么?如果我使按钮成为MovieClip,它工作正常(虽然我必须自己控制帧).
我知道可以用来解决这个问题的不同方法,但这意味着要改变很多东西,我想知道为什么SimpleButton会忽略Flash中设置的实例名称
编辑
进一步研究一下,似乎即使Flash IDE中的按钮中没有关键帧,Flash upState也会为每个项创建4个实例(例如,通过示例跟踪将为我TextField提供实例名称"instance2",而在的downState,实例名称是"instance4").如果我在一个状态下更改文本,则不会反映在其他状态中.
我在想,当Flash创建对象时,它不会正确地复制所有属性(即实例名称)
编辑
我同意Shane的回答是一个解决方法 - 我自己说过我知道解决这个问题的不同方法 - 但它忽略了问题,它没有解决它(这是我没有解决的唯一原因)接受它).我首先来到SO,看看是否有人知道为什么它首先发生(tbh,它似乎是SDK中的一个错误).
我也理解"你不应该在SimpleButton中访问孩子;如果你想要更多控制,使用Sprite或MovieClip"这一论点背后的原因,但我不同意.Flash IDE允许您创建其中包含命名实例的按钮,而SimpleButton文档允许您访问不同的状态,因此对我来说,这是可接受的行为.如果SimpleButton只能用于非常基本的,不可更改的静态按钮(也可以考虑本地化),那么它就没用了.你可以使用Sprite和MovieClip,但是你必须自己控制不同的状态,这会变得很尴尬.我有自己的Button类来处理样板,但我不应该重写基本的SDK功能,这就是为什么对我来说这是一个bug.
我将保持赏金开放的时间.如果我什么也得不到,那么我会把它交给谢恩.
这是因为flash.display.SimpleButton类不继承DisplayObjectContainer,并且状态容器也不是DisplayObjectContainers:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/SimpleButton. HTML
基本上,简单按钮的定义很简单.如果想要对内部对象进行更复杂的控制,则必须使用将ButtonMode设置为true的Sprite或MovieClip.