![]() |
вопрос по addChild
если:
var s:Sprite = new Sprite(); var u:Box= new Box(); // например Box то u.addChild(s); вызывает ошибку cannot convert flash.display::Sprite@854e7e6 to mx.core.IUIComponent. Хотя, по идее, у метода addChild(val: DisplayObject). Понятно, что Sprite не ипмплементирует mx.core.IUIComponent, а, как видно, контейнер Box этого хочет. Но как тогда быть, если я хочу "прибить" Sprite instance к Box instance? (например, нарисовать че-нить в Sprite программно, а потом засунуть в Box). |
Box - должен быть наследован от Sprite
|
в том то и дело, что Box - это mx.containers.Box, который наследуется от Container -> UIComponent -> Sprite.
Но, факт есть, возникает вышеописанная ошибка. UP! |
в классе mx.core.Container метод addChild перегружен - не смотря на то что в документации он принимает DisplayObject, скорее всего addChild (child:IUIComponent) или ошибка возникает внутри переписанного метода, где пытаются привести аргумент к IUIComponent
|
ок, это понятно.
Но как тогда быть? Т.е. я не могу добавить объект Sprite, MovieClip... (все , что выше UIComponent'ов в цепочке наследования) как child в какой-нибудь UIComponent. В принципе, вопрос был в этом. Мне кажется, что такая ситуация "не есть хорошо") |
такая ситуация наблюдается только с instance'ами наследников mx.core.Container.
C наследиками UIComponent (например, Button) все нормально |
Цитата:
|
На уровне UIObject это реализовано так:
1. Каждый компонент -- визуальный класс (наследним мувиклипа). 2. Создание включает в себя либо аттач, либо createEmptyMovieClip c Object.registerClass Поэтому не вижу причин не цеплять простейшие классы. Посмотрю позднее, сейчас некогда. |
Цитата:
Миша, ты про что это :) этож АС3 :) |
А ты думаешь внутри везде все другое?:) У меня вот нет 100% уверенности
|
Цитата:
Я искал в гугле что-нибудь на эту тему: нашлось 2 ссылки (та же проблема) на форумы - вроде французский и польский что ли... в этих языках я не силен:( и насколько видно (мое предположение:)) из тамошних дискуссий, четкого ответа нет... Так что вот так... Косяк какой-то. |
посмотрел в дебаггере у функции addChild у mx.core.Container есть локальная переменная uiChild
то есть происходит что-то вроде Код:
public override function addChild (child:DisplayObject):DisplayObject { |
Или обернули их еще в один декоратор :)
|
Нет не обернули, так как такая конструкция не дает возможности копировать ЗАГРУЖЕННЫЙ МУВ из одного парента в другой (без переиницилизации этого мува), а если есть конструкция которая позволяет это делать то нету надобности в createEmptyMovieClip (), attachMovie (), createTextField (), Object.registerClass ()
|
Цитата:
все это, конечно, хорошо. но вопрос остается: что делать:)? забить? |
наследуй не от Spite, а от UIComponent
|
что делать ... что делать .... а чего собсвенно пытаемся добиться? а то как-то отвлеклись от основй темы и перешли непонятно куда.
|
Добиться того, чтобы в контейнер (объект mx.core.Container) можно было "вставить" addChild'ом объект Sprite.
Но, я так понимаю, обсуждать здесь больше нечего... Придется действительно вместо Sprite использовать более громоздкий UIComponent. |
Спросил бы во Флекскодерз -- дали бы ответ сами Адобовцы. Они знают побольше нас.
|
Я реально наверно не понимаю. Зачем это делать?
|
наверное, не понимаешь. Я в первом посте, в принципе, пытался объяснить.
|
Да какая разница, зачем. Просто непонятно, почему не дает. И это уже само по себе интересно.
|
ну наверно как первая нормальная библиотека компонентов, все что добавляется внутрь компонента, регистрируется в LayoutManager, и чтобы он мог этим чайлдом мог нормально тусовать тут должен реализовывать интерфейс IUIComponent. я же говорил что метод переписан в mx.core.Container, в переписанном методе и происходит попытка привести к IUIComponent.
|
во flexcoders примерно то же самое ответили. В качестве выхода, чел предложил сначала Sprite запихнуть в UIComponent - это работает, а потом UIComponent уже в Container. Таким образом, все нормально.
|
сам недавно наткнулся на проблему. Если еще актуально, вот решение:
Код:
var s:Sprite = new Sprite(); |
Я думаю, год назад уже разобрались.
|
| Часовой пояс GMT +4, время: 04:16. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.