Невозможно установить кнопку Spark iconDisplay source.Продолжайте получать нулевую ссылку - PullRequest
0 голосов
/ 04 декабря 2011

Может кто-нибудь объяснить, что я делаю не так? Я просто пытаюсь установить значок для кнопки в проекте Flex Mobile с помощью ActionScript. Я продолжаю получать нулевую ссылку на ошибку. Но я на 100% уверен, что это не плохой путь. Я использовал тот же путь в приложении десятки раз.

var editCalloutBtn:CalloutButton = new CalloutButton;
if(value.type=="reminder")
{
            //this is where the null error happens
        editCalloutBtn.iconDisplay.source="assets/images/reminderIcon_45.png";

}else
{
        editCalloutBtn.iconDisplay.source="assets/images/deadlineIcon_45.png";
}
callout_group.addElement(editCalloutBtn);

Для теста я установил значок, используя тот же путь, делая все в mxml, и это работает. Так что это не путь. Но мне нужно сделать это с помощью ActionScript, чтобы я мог установить значение динамически.

Есть идеи?

1 Ответ

2 голосов
/ 05 декабря 2011

Компоненты Flex создаются ленивым образом. Это означает, что любые подкомпоненты не будут созданы, пока они действительно не потребуются . И пока компонент не был добавлен в список отображения, вы можете быть уверены, что его подкомпоненты не понадобятся (вы можете использовать Google «Жизненный цикл компонента Flex», если хотите узнать о нем больше).

Более конкретно для вашего случая

Вы пытаетесь получить доступ к 'iconDisplay' до того, как CalloutButton был добавлен в список отображения, поэтому свойство 'iconDisplay' имеет значение 'null'.

Решение

Я не совсем уверен, почему вы хотите сделать это в ActionScript, но в любом случае вот исправление: вы должны слушать FlexEvent.CREATION_COMPLETE. Когда это событие вызывается CalloutButton, вы будете уверены, что его подкомпонент 'iconDisplay' больше не является 'нулевым'.

var editCalloutBtn:CalloutButton = new CalloutButton();
editCalloutBtn.addEventListener(
    FlexEvent.CREATION_COMPLETE, onCalloutButtonReady);
callout_group.addElement(editCalloutBtn);

private function onCalloutButtonReady(event:FlexEvent):void {
    //remove the event listener: we no longer need it
    editCalloutBtn.removeEventListener(    
        FlexEvent.CREATION_COMPLETE, onCalloutButtonReady);

    //no longer null
    trace(editCalloutBtn.iconDisplay); 
}

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

...