Как addChild выбрать неправильный индекс вставки?

Итак, в приложении Flex я добавляю новый компонент графического интерфейса пользователя, создавая его и вызывая parent.addChild(). Однако в некоторых случаях это вызывает ошибку в кишечнике Flex. Оказывается, addChild на самом деле:

return addChildAt(child, numChildren);

В тех случаях, когда он ломается, каким-то образом numChildren отключается на единицу. Приводя к этой ошибке:

RangeError: Ошибка № 2006: Указанный индекс находится за пределами допустимого диапазона. в flash.display :: DisplayObjectContainer / addChildAt () в mx.core :: Container / addChildAt () в mx.core :: Container / addChild (). . в flash.events::EventDispatcher/dispatchEventFunction () в flash.events::EventDispatcher/dispatchEvent () в mx.core :: UIComponent / dispatchEvent () в mx.controls :: SWFLoader :: contentLoaderInfo_completeEventHandler ()

Это ошибка Flex или того, как я ее использую? Похоже, это может быть ошибка потоковой передачи, но поскольку Flex не поддерживает потоки, это немного сбивает с толку.


person MidnightGun    schedule 29.09.2008    source источник
comment
Не могли бы вы переформатировать ошибку, добавив разрывы строк, это затрудняет чтение остальной части сообщения!   -  person Paul Dixon    schedule 29.09.2008


Ответы (5)


Я заметил, что это чаще всего происходит при смене родителей UIComponent, который уже находится в списке отображения. Вы меняете родителей в этой ситуации?

person user23405    schedule 29.09.2008
comment
Придется проверить. Есть идеи, как это исправить? - person MidnightGun; 29.09.2008
comment
У меня это сработало. Я добавил проверку, чтобы увидеть, добавлен ли уже ребенок. Если это так, я удаляю его перед повторным добавлением. если (панель.содержит (myChild)) {панель.removeChild (myChild); } - person user2367418; 10.12.2019

Возможно ли, что вы добавляете дочерний элемент до того, как компонент будет полностью инициализирован? Может быть, попробовать добавить потомка после трансляции Event.COMPLETE?

Он может не поддерживать потоки, но все еще асинхронный ...

person onekidney    schedule 29.09.2008
comment
Если я правильно помню, у меня была такая же проблема, и она была виновата. - person hasseg; 30.09.2008

numChildren не ссылается на существующий индекс в дочернем массиве. Массивы в AS3 индексируются, начиная с 0. Это означает, что последний элемент в вашем массиве для индекса numChildren - 1, а не numChildren.

попробуйте addChildAt (child, numChildren - 1);

person Community    schedule 24.10.2008
comment
Если бы я мог проголосовать за это более одного раза, я бы сделал это! Увидел исходный вопрос и хотел подождать секунду ... - person Tim Keating; 02.06.2012

Хорошо, как допинг, я пытался добавить дочерний элемент в контейнер, даже если он уже был там, отсюда и сбивающее с толку сообщение «неправильный индекс вставки».

person Community    schedule 23.10.2008

ср. http://forums.devshed.com/flash-help-38/scroll-pane-scroll-bars-not-working-818174.html - вам нужно добавить дочерних элементов к экранному объекту, а затем установить источник полосы прокрутки. чтобы быть экранным объектом. Вроде как это ...

Код:

var myDisplay : DisplayObject = new DisplayObject();

myDisplay.addChild(myChild1);
myDisplay.addChild(myChild2);
myDisplay.addChild(myChild3);
myDisplay.addChild(myChild4);

ScrollPane.source = myDisplay;
ScrollPane.update();
person Paul    schedule 29.12.2011