Возвращаемое значение вместо нуля - PullRequest
0 голосов
/ 21 сентября 2010

Я пытаюсь вызвать функцию и передать ей несколько свойств, однако она жалуется, что объект, на который я пытаюсь нацелиться, является нулевым. Кто-нибудь может увидеть, где я иду не так?

<mx:ViewStack id="vs" width="100%" height="100%" y="53"> 
    <mx:Canvas id="view1" label="Community" width="100%" height="100%" backgroundColor="#ff9900" showEffect="WipeDown" hideEffect="WipeUp">
        <mx:Label text="Community"/>
    </mx:Canvas>
    <mx:Canvas id="view2" label="Apps" width="100%" height="100%" backgroundColor="green">
        <mx:HTML id="myHTML" width="100%" height="100%" 
        visible="true"
        paintsDefaultBackground="true"
        htmlRender="browser_completeHandler(event)"
        locationChange="browser_locationChangeHandler(event)"
        complete="browser_completeHandler(event)" />
    </mx:Canvas>
</mx:ViewStack>


<local:DockBar id="dockbar" horizontalCenter="0" bottom="0" width="100%" height="100" minSize="32" maxSize="80">
    <mx:Label visible="false" id="menuLabel" text="Menu" bottom="0" horizontalCenter="0" fontSize="24" color="#ffffff" alpha=".75" />
    <mx:Image click="gotoApp('Google','http://www.google.com/')" source="{icon1}" buttonMode="true" useHandCursor="true" toolTip="Nice red" rollOver="turnOn(event)" rollOut="turnOff(event)" />
    <mx:Image click="gotoApp('Yahoo','http://www.yahoo.com/')" source="{icon2}" buttonMode="true" useHandCursor="true" toolTip="Cool orange" rollOver="turnOn(event)" rollOut="turnOff(event)" />
    </mx:HBox>
</local:DockBar>

и функция выглядит так:

private function gotoApp(id:String,url:String):void {
    vs.selectedChild=view4;
    trace(myHTML);
}

При первом щелчке по изображению возвращается ноль, однако последующие попытки отслеживают значение (я полагаю, потому что оно установлено тогда, а не при загрузке приложения). Есть идеи, как распознать его при загрузке приложения?

Приветствия

Ответы [ 4 ]

1 голос
/ 21 сентября 2010

Предполагая, что "view4" является опечаткой, а вы имели в виду "view2", вы можете установить creationPolicy на вашем ViewStack на "all". По умолчанию ViewStacks создает экземпляр только первого представления при создании, если для creationPolicy задать значение «all», то все экземпляры в стеке будут созданы.

1 голос
/ 21 сентября 2010

ViewStack по умолчанию будет создавать свои дочерние элементы лениво в порядке документов, поэтому только первый дочерний элемент, который будет виден при загрузке (т.е. view1), не будет иметь нулевой идентификатор в вашей функции. Последующие нажатия на ViewStack создадут другие представления (view2, view3 и view4), поэтому ошибка больше не будет возникать.

Таким образом, вам нужно изменить код, добавив creationPolicy = "all", чтобы исправить это:

<mx:ViewStack id="vs" creationPolicy="all" width="100%" height="100%" y="53"> 
    <mx:Canvas id="view1" label="Community" width="100%" height="100%"> 
        ...  
    </mx:Canvas>
        ...
    <mx:Canvas id="view4" label="Apps" width="100%" height="100%">
        ...
    </mx:Canvas>
</mx:ViewStack>
1 голос
/ 21 сентября 2010

Что ж, «view4» не является дочерним элементом вашего стека просмотра, поэтому он собирается бросить нулевой указатель, когда попытается сместить своих дочерних элементов.

Причина, по которой он не выбрасывает его во второй раз, вероятно, из-за чего-то вроде

public function set selectedChild( child : Object ) : void {
    if ( child == _selectedChild ) return;
    ...
}

Это довольно распространенный шаблон в сеттерах.

0 голосов
/ 25 сентября 2010

Попробуйте установить, используя вместо этого свойство selectedIndex:

vs.selectedIndex = 1;

Таким образом, вы не потеряете преимущества отложенного создания экземпляра.

...