Как придать динамически создаваемым кнопкам действия для каждой из них - часть 2
-
13-09-2019 - |
Вопрос
Еще раз привет, товарищи Мигалки :)
Мой первый вопрос, заданный здесь, в 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" в этих двух местах вашего нового обработчика, и это должно устранить ваши проблемы.Я надеюсь, что это помогло!