Компонент TextArea имеет значение null при событии applicationComplete

У меня странная проблема (странная, потому что она характерна для одного компонента) с applicationComplete в довольно простом приложении. Все компоненты пользовательского интерфейса объявлены в MXML. Я могу получить к ним доступ в applicationComplete, но не в компоненте spark.components.TextArea с именем taStatus здесь; в обработчике он равен нулю.

MXML выглядит примерно так (есть много других компонентов, но ничего особенного)

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="710" minHeight="640" applicationComplete="onApplicationComplete(event)" width="710" height="640">
    <mx:TabNavigator left="15" right="15" top="15" bottom="340" paddingTop="0">
        <s:NavigatorContent label="General" width="100%" height="100%">
            <s:Label x="93" y="71" text="Label" id="lblTest"/>
        </s:NavigatorContent>
        <s:NavigatorContent label="Status" width="100%" height="100%">
            <s:TextArea id="taStatus" width="100%" height="100%" text="Startup." editable="false"/>
        </s:NavigatorContent>
    </mx:TabNavigator>
    <fx:Script source="main.as" />
</s:Application>

Вот обработчик в main.as

protected function onApplicationComplete(event: FlexEvent) : void
{
    lblTest.text = 'abc789';    // OK
    taStatus.text = 'abc789';   // Fail 
}

TypeError: ошибка № 1009: невозможно получить доступ к свойству или методу ссылки на нулевой объект. Итак, taStatus имеет значение null ... Что такого особенного в этом TextArea?

Обновление 12-06-2010, 02:53 Перемещение NavigatorContent (вкладки) над всеми другими вкладками внезапно приводит к своевременному созданию экземпляров TextAreas. Очень странно, потому что все компоненты однозначно создаются; Я их вижу.


person Atorian    schedule 11.06.2010    source источник


Ответы (1)


Это потому, что TextArea находится в дочернем элементе TabNavigator, который не является первым дочерним элементом, поэтому по умолчанию он не создается, пока пользователь не откроет эту вкладку.

У вас есть варианты: либо дождаться, пока пользователь откроет эту вкладку, чтобы сделать то, что вам нужно сделать, чтобы настроить TextArea, либо изменить политику создания дочерних элементов в TabNavigator, чтобы создать все его дочерние элементы при запуске, а не ждать, пока они будут щелкнуть.

Для этого вам необходимо установить для свойства CreationPolicy в TabNavigator значение «all».

person DanK    schedule 11.06.2010
comment
Идеальное решение / ответ. Спасибо DanK; это начинало сводить меня с ума ;-) - person Atorian; 12.06.2010