Как придать динамически создаваемым кнопкам действия для каждой из них - часть 2

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

Вопрос

Еще раз привет, товарищи Мигалки :)

Мой первый вопрос, заданный здесь, в StackOverflow, касался этой проблемы, у меня был массив, который создавал несколько разных кнопок.Однако я не знал, как назначить им действия:Как придать динамически создаваемым кнопкам действия для каждой из них - часть 1

Благодаря Джоэл Хукс, Я смог заставить свой код работать.Однако на этот раз вместо того, чтобы использовать импортированную графику в качестве класса из моей библиотеки, я вместо этого создаю видеоролик, рисуя градиент * (не нужно было импортировать jpg) *.Теперь я получаю еще один страшный "не постоянная времени компиляции" снова ошибка.Я полагаю, что это как-то связано с тем, как я пытаюсь определить экземпляр кнопки, который нажимается или откатывается.

Предыдущее создание кнопки (работает) код:

для (var i: Число=0;i < myXMLArray.длина;i++) { navButton=новая навигационная кнопка ;navButton.name ="кнопка" + i;navButton.x=i * Навигационный размер;Навигационная кнопка.y=navBtnY;navButton.buttonMode=истина;thumbsMov.addChild(навигационная кнопка);

кнопки.нажатие (навигационная кнопка);кнопки[i].addEventListener(событие мыши.MOUSE_UP,handleButtonClick);кнопки[i].addEventListener(MouseEvent.ROLL_OVER,handleButtonOver);кнопки[i].addEventListener(MouseEvent.ROLL_OUT,handleButtonOff);}

Предыдущий слушатель (работает) код:

function handleButtonOver(event:MouseEvent):void {

кнопка var:NavButton = событие.target как NavButton;идентификатор переменной:Number = Номер (кнопка.name.split("кнопка")1);если (кнопка) TweenLite.to (buttonRolls[id], .4, {альфа:1, простота: сильная.easeOut});cataText[идентификатор].defaultTextFormat = a12Green;cataText[id].text = myXMLArray[id].id;}

Текущий код создания кнопки:

for (var i:Number = 0; i < num; i++) {
trace("loop number = "+i);

var blueGradient:MovieClip = new MovieClip();
 blueGradient.name = "button" +i;
 blueGradient.graphics.beginGradientFill(bGrad, bColors, bAlphas, bRatios ,bMatrix)
 blueGradient.graphics.drawRect(0, 0, 266, 40);
 blueGradient.x = i * navSIZE;
 blueGradient.y = navBtnY;
 blueGradient.buttonMode = true;
addChild(blueGradient);

buttons.push(blueGradient)

buttons[i].addEventListener(MouseEvent.MOUSE_UP, handleButtonClick);
buttons[i].addEventListener(MouseEvent.ROLL_OVER, handleButtonOver);
buttons[i].addEventListener(MouseEvent.ROLL_OUT, handleButtonOff);

}

Текущий код прослушивателя кнопок:

function handleButtonOver(event:MouseEvent):void {
var button:blueGradient = event.target as blueGradient;
var id:Number = Number(blueGradient.name.split("button")[1]);
if(blueGradient)
 cataText[id].defaultTextFormat = navFontRoll;
 cataText[id].text = myArray[id].id;

}

Текущий фильм будет запускаться без ошибок только в том случае, если следующая строка закомментирована:

var button:blueGradient = event.target as blueGradient;

Потому что именно это вызывает появление ошибки not compile time constant (не постоянная во время компиляции). Однако, удалив эту строку, все кнопки становятся button1 вместо двух динамически созданных кнопок с именами button0 и button1.

Мы были бы очень признательны за любую помощь или указания здесь!Заранее спасибо, что взглянули на мой код.

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

Решение

Я думаю, поскольку as ключевое слово предназначено для приведения, вместо этого вам нужна эта строка:

var button:MovieClip = event.target as MovieClip;

blueGradient кажется, это имя переменной, а не имя класса.

Другие советы

Ваша проблема в том, что вы путаете класс blueGradient с объектом button .В исходном обработчике ваш код говорит:

var button:NavButton = event.target as NavButton;
var id:Number = Number(button.name.split("button")[1]);
if(button)....

Но в вашем новом коде,

var button:blueGradient = event.target as blueGradient;
var id:Number = Number(blueGradient.name.split("button")[1]);
if(blueGradient)

Вы видите разницу?В обоих случаях вы ссылаетесь на свой объект button как "var button" - но затем в новой версии вы пишете "blueGradient.name.split ..." вместо "button.name.split ..." и то же самое для вашего оператора if().

Ключевое слово var определяет имя объекта.Синтаксис - var [objectName]:[ObjectType] , и когда вы работаете с этим объектом, вам всегда захочется ссылаться на него по имени, а не по типу.Если только у вас нет статического класса со статическим методом, но это немного более продвинутый.

Итак, вкратце:замените "blueGradient" на "button" в этих двух местах вашего нового обработчика, и это должно устранить ваши проблемы.Я надеюсь, что это помогло!

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