Проблема с именами экземпляров внутри кнопки - PullRequest
5 голосов
/ 02 сентября 2011

Я создал кнопку во 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

EDIT

Если взглянуть немного дальше, кажется, что даже несмотря на то, что в кнопке Flash IDE нет ключевых кадров, Flash создает 4 экземпляра каждого элемента (например, при трассировке через upState я получу TextField с имя экземпляра "instance2", тогда как в downState имя экземпляра равно "instance4"). Если я изменю текст в одном состоянии, он не будет отражен в других.

Я думаю, что когда Flash создает объекты, он не копирует должным образом все свойства (а именно имя экземпляра)

EDIT

Я согласен, что ответ Шейна - это обходной путь - я сам сказал, что знаю разные способы решения проблемы - но он игнорирует проблему, не решает ее (это единственная причина, почему я не принял это). Я пришел в SO в первую очередь, чтобы узнать, знает ли кто-то, почему это происходит в первую очередь (кажется, это ошибка в SDK).

Я также понимаю причину, лежащую в основе аргумента «вам не следует обращаться к дочерним элементам в SimpleButton; если вы хотите больше контроля, используйте Sprite или MovieClip», но я с этим не согласен. Flash IDE позволяет создавать кнопки с именованными экземплярами внутри них, а документы SimpleButton предоставляют вам доступ к различным состояниям, поэтому для меня это приемлемое поведение. Если SimpleButton можно использовать только для очень простых, неизменяемых статических кнопок (также подумайте о локализации), то это довольно бесполезно. Вы можете использовать Sprite и MovieClip, но тогда вам придется самим управлять различными состояниями, что неловко. У меня есть свой собственный класс Button для работы с образцом, но мне не нужно было переписывать основные функциональные возможности SDK, поэтому для меня это ошибка.

Я буду держать награду открытой, пока она там есть. Если я больше ничего не получу, то передам это Шейну.

1 Ответ

5 голосов
/ 02 сентября 2011

Это связано с тем, что класс flash.display.SimpleButton не наследуется от DisplayObjectContainer, а контейнеры состояний также не являются DisplayObjectContainers: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/SimpleButton.html

По сути, простые кнопки по определению просты. Если вы хотите более сложный контроль над внутренними объектами, вам придется использовать Sprite или MovieClip с buttonMode, установленным в true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...