【发布时间】:2011-11-09 01:50:49
【问题描述】:
我在 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 跟踪会给我一个 TextField 和实例名称为“instance2”,而在downState 中,实例名称为“instance4”)。如果我在一种状态下更改文本,它不会反映在其他状态中。
我在想,当 Flash 创建对象时,它并没有正确复制所有属性(即实例名称)
编辑
我同意 Shane 的回答是一种解决方法 - 我自己说过,我知道解决问题的不同方法 - 但它忽略了问题,它没有解决它(这是我的唯一原因没有接受)。我首先来到 SO 看看是否有人可能首先知道它为什么会发生(tbh,这似乎是 SDK 中的一个错误)。
我也理解“您不应该在 SimpleButton 中访问子项;如果您想要更多控制,请使用 Sprite 或 MovieClip”这一论点背后的原因,但我不同意。 Flash IDE 允许您在其中创建带有命名实例的按钮,而 SimpleButton 文档使您可以访问不同的状态,因此对我来说,这是可以接受的行为。如果 SimpleButton 只能用于非常基本的、不可更改的静态按钮(也可以考虑本地化),那么它就毫无用处了。你可以使用 Sprite 和 MovieClip,但是你必须自己控制不同的状态,这很尴尬。我有自己的 Button 类来处理样板,但我不应该重写基本的 SDK 功能,这就是为什么对我来说这是一个错误。
我会一直开放赏金,直到它在那里。如果我什么也得不到,那我就给谢恩。
【问题讨论】:
-
shanethehat 是绝对正确的,您无法访问 Button 内的对象。
-
@Hardik 你可以访问按钮内的对象,我在上面的代码中做到了。如果是我不应该,那就另当别论了
-
好的,如果你想对按钮的状态做一些动画效果,试着在按钮内创建MovieClip。在 UP OVER DOWN 上单独的 MovieClip。
-
我仍然有同样的问题(在这种情况下访问 MovieClip) - 它没有尝试动画或任何东西 - 这就是为什么当我从 Flash IDE 导出 SimpleButton 时,它会清除实例我设置的名称
标签: flash actionscript-3 textfield