Каков правильный способ добавления компонентов в библиотеку Swf-файла?

StackOverflow https://stackoverflow.com/questions/2162529

Вопрос

У меня была проблема, которая много раз преследовала меня в ходе разработки Flash-проекта.Выглядит это примерно так:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at fl.containers::BaseScrollPane/fl.containers:BaseScrollPane::drawBackground()
at fl.controls::TileList/fl.controls:TileList::draw()
at fl.core::UIComponent/::callLaterDispatcher()
TypeError: Error #2007: Parameter child must be non-null.
at flash.display::DisplayObjectContainer/addChildAt()
at fl.controls::BaseButton/fl.controls:BaseButton::drawBackground()
at fl.controls::BaseButton/fl.controls:BaseButton::draw()
at fl.core::UIComponent/drawNow()
at fl.controls::ScrollBar/fl.controls:ScrollBar::draw()
at fl.core::UIComponent/::callLaterDispatcher() 

Теперь, в моем случае, эта ошибка возникает из-за инициализации компонентов в коде, когда они не были явно добавлены в библиотеку компонентов fla в CS4.В прошлом я сталкивался с этой проблемой при попытке динамического создания областей прокрутки в коде.Я решил эту проблему, добавив компоненты ScrollPane в мою библиотеку Main.fla.Какое-то время это, казалось, работало.

Теперь я пытаюсь использовать поле автозаполнения AstraFlash.Я импортировал соответствующие fla-файлы в CS4 и поместил поле автозаполнения в свой Swf-файл.Все строится нормально, но приведенная выше ошибка возникает при загрузке Swf-файла.Я думаю, что поле автозаполнения пытается создать область прокрутки как часть своей функциональности.Хорошо, я это понимаю, поэтому я также добавляю компонент ScrollPane в библиотеку с теми же результатами.

Обычно я бы просто возился с библиотечными компонентами / настройками, пока не избавлюсь от ошибки, но мне надоело сталкиваться с этим, и я хочу знать правильный способ решения проблемы.Итак, вот несколько вопросов, которые у меня есть:

  • Когда вам требуется добавить компонент в библиотеку Fla, а не просто создать компонент в коде?

  • В какие контейнеры вам нужно добавить этот компонент?Только тот, кто им пользуется?Или все родители этого штата Флорида тоже?

  • Допустим, для компонента автозаполнения требуется компонент ScrollPane.Почему эта зависимость не распознается, когда я добавляю один компонент?Почему я должен явно добавлять это?

  • В чем разница между добавлением компонента в библиотеку и добавлением его в папку "Ресурсы компонентов" библиотеки?Для чего предназначена эта папка?

Мне действительно нужно, чтобы этот компонент автозаполнения работал.Предполагая, что код AS3 правильный, и я все еще получаю приведенную выше ошибку, какие настройки, по вашему мнению, вероятно, неверны?Из-за разочарования я попытался добавить все возможные компоненты в библиотеку, а также в папку component assets библиотеки, просто чтобы иметь отправную точку, но я по-прежнему получаю сообщение об ошибке.

Любая помощь приветствуется.

Это было полезно?

Решение

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

Это должно сработать, если вы скомпилируете классы из дочернего fla в родительский fla, но это будет дублировать вещи.

Проблема в том, что когда вы загружаете swf-файл, классы располагаются в другом Область применения.Проще говоря, это то, что управляет классами в swf-файле, чтобы у вас не возникало конфликтов классов между загрузчиком и загруженным swf-файлом и некоторыми другими элементами безопасности.

Я создал простой fla, который содержит компонент Button (fl.controls.Кнопка) и загрузил его из fla загрузчика.Я не добавлял компонент Button в fla загрузчика, но создал экземпляр button, используя домен приложения загруженного swf-файла.Вот как это делается:

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded);
loader.load(new URLRequest('componentContainer.swf'));

function loaded(event:Event):void {
   addChild(loader.content);
   var SWFButton:Class = loader.contentLoaderInfo.applicationDomain.getDefinition('fl.controls.Button') as Class;
   var button = new SWFButton();
   button.label = 'Test';
   addChild(button);
}

В Programming Actionscript 3.0 есть страница, посвященная такого рода проблемам и тому, как использовать ApplicationDomain, но, честно говоря, я не до конца понял это.

HTH, Джордж

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top