Ошибка AS3 № 1065

Я должен упустить что-то простое здесь, но в моем основном приложении я импортирую свой класс Pages, который, в свою очередь, импортирует и динамически создает один из двух типов страниц. К сожалению, это приводит только к ошибке: ReferenceError: Error #1065: Variable PageA не определена. (когда я вызываю Pages.load("A");)

Страницы

package pages 
{
    import pages.PageA;
    import pages.PageB;
    import flash.display.Sprite;
    import flash.utils.getDefinitionByName;

    public class Pages 
    {
        public static function load(pageType:String):void
        {
            var pageClass:Class = getDefinitionByName("pages.Page"+pageType) as Class;
        }
    }
}

Страница А

package pages 
{
    import flash.display.Sprite;

    public class PageA extends Sprite 
    {
        public function PageA()
        {
            trace("PageA init");
        }
    }
}

Страница Б

package pages 
{
    import flash.display.Sprite;

    public class PageB extends Sprite 
    {
        public function PageB()
        {
            trace("PageB init");
        }
    }
}

person Devin Rodriguez    schedule 05.09.2012    source источник
comment
Не похоже, что у вас должны быть проблемы с опубликованным кодом. Вы уверены, что это все, что у вас есть?   -  person Adam Harte    schedule 05.09.2012
comment
Ваша функция загрузки кажется довольно бесполезной, поскольку она ничего не возвращает и не хранит ничего за пределами функции.   -  person BadFeelingAboutThis    schedule 05.09.2012
comment
Я обрезал код до минимума, необходимого для воспроизведения ошибки. Я определил, что, поскольку классы не объявлены в коде, компилятор их не включает, поэтому, когда само приложение загружает их, их нигде нельзя найти.   -  person Devin Rodriguez    schedule 05.09.2012


Ответы (1)


Именно, компилятор просто не включил эти классы в скомпилированный SWF. Я где-то уже сталкивался с этой стеной, когда пытался создать экземпляр с помощью сгенерированной строки (в моем случае «Gem» + целое число) и получил примерно ту же ошибку. Я обошел это, создав фиктивную константу, перечислив все классы, которые я планирую использовать, это дало компилятору знать об этом. Итак, сделайте следующее:

private static const PAGES:Array=[PageA, PageB];

И компилировать. Следует сделать. Кроме того, вам не нужно импортировать части пакета «страницы», они уже видны в вашем проекте, поскольку ваш класс «Страницы» принадлежит тому же пакету.

person Vesper    schedule 05.09.2012
comment
Гений! Отличное решение, высоко ценится. Теперь, когда я решил эту надоедливую проблему, я могу продолжить разработку в FlashDevelop! - person Devin Rodriguez; 05.09.2012