iconitemrenderer кликабельные объекты? - PullRequest
1 голос
/ 29 июня 2011

Я делаю мобильное приложение в Flash Builder 4.5 для Android и iOS и использую классы itemRenderer и iconitemrenderer для составления списка опций для моего приложения.По какой-то причине я не могу сделать их кликабельными или определить действия, которые нужно выполнять при каждом нажатии.По сути, я стремлюсь использовать «представления» FB, а при нажатии на элемент переключаться на новый вид.Вот код, с которым я работаю:

<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:ms="libs/MessageBox-digitalRetro">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:actionContent>
        <s:Button id="signin" label="Sign in" click="onSignIn(event)"/>
    </s:actionContent>
        //code for the clicking of the sign in button
    <fx:Script>
        <![CDATA[
            protected function onSignIn(event:Event):void
            {

            }
        ]]>
    </fx:Script>
    <s:List height="100%" width="100%">
        <s:itemRenderer>
            <fx:Component>
                <s:IconItemRenderer height="100" labelField="name" 
                                    iconField="photo" iconHeight="80" 
                                    iconWidth="80" messageFunction="getMessage">
                    <fx:Script>
                        <![CDATA[
                            import spark.components.NavigatorContent;
                                                    //this first method works
                            protected function getMessage(o:Object):String
                            {
                                return o.message;
                            }
                        ]]>
                    </fx:Script>
                </s:IconItemRenderer>
            </fx:Component>
        </s:itemRenderer>
        <s:dataProvider>
            <s:ArrayCollection>
                <fx:Object name="Projects" photo="@Embed('libs/ProjectsIcon2.png')" message="Learn more about what we're working on" clickfn="views/Projects"/>
                <fx:Object name="Locate Office" photo="@Embed('libs/google-maps-icon.png')" message="Find directions to our nearest office" clickfn=""/>
                <fx:Object name="Contact Us" photo="@Embed('libs/gmailicon.png')" message="Let us know your thoughts!" clickfn=""/>
                <fx:Object name="About Us" photo="@Embed('libs/info-icon.png')" message="" clickfn=""/>
            </s:ArrayCollection>
        </s:dataProvider>
            <s:change>
        <![CDATA[
                // NEW!!!
            var ClassReference:Class = getDefinitionByName(event.currentTarget.selectedItem.clickfn) as Class;
            navigator.pushView(ClassReference);
        ]]>
    </s:change>
    </s:List>
</s:View>

РЕДАКТИРОВАТЬ: я добавил тэг "change", и теперь он компилируется, но я получаю сообщение об ошибке:

ReferenceError: Error #1065: Переменные проекты не определены.в global / flash.utils :: getDefinitionByName () в представлениях :: MainHomeView / ___ MainHomeView_List1_change () [C: \ Users \ jlehenbauer \ Adobe Flash Builder 4.5 \ Metters Inc \ src \ views \ MainHomeView.mxml: 56] в flash.events:: EventDispatcher / dispatchEventFunction () в flash.events::EventDispatcher/dispatchEvent () в mx.core :: UIComponent / dispatchEvent () [E: \ dev \ 4.5.1 \ frameworks \ projects \ framework \ src \ mx \ core\ UIComponent.as: 13128] на spark.components :: List / commitSelection () [E: \ dev \ 4.5.1 \ frameworks \ projects \ spark \ src \ spark \ components \ List.as: 1205] на spark.components.supportClasses :: ListBase / commitProperties () [E: \ dev \ 4.5.1 \ frameworks \ projects \ spark \ src \ spark \ components \ supportClasses \ ListBase.as: 939] в spark.components :: List / commitProperties ()[E: \ dev \ 4.5.1 \ frameworks \ projects \ spark \ src \ spark \ components \ List.as: 1069] в mx.core :: UIComponent / validateProperties () [E: \ dev \ 4.5.1 \ frameworks\ projects \ framework \ src \ mx \ core \ UIComponent.as: 8209] в mx.managers :: LayoutManager / validateProperties () [E: \ dev \ 4.5.1 \ frameworks \проекты \ framework \ src \ mx \ Manager \ LayoutManager.as: 597] в mx.managers :: LayoutManager / doPhasedInstantiation () [E: \ dev \ 4.5.1 \ frameworks \ projects \ framework \ src \ mx \ Manager \ LayoutManager.as: 813] в mx.managers :: LayoutManager / doPhasedInstantiationCallback () [E: \ dev \ 4.5.1 \ frameworks \ projects \ framework \ src \ mx \ Manager \ LayoutManager.as: 1180]

Ответы [ 4 ]

1 голос
/ 28 августа 2011

Вы можете использовать условные выражения, выполнив приведенное выше предложение следующим образом:

<pre>
<s:dataProvider>
<s:ArrayList>
    <s:DataItem name="Projects" message="Learn more about what we're working on"   nextView="{views.Projects}" />
    <s:DataItem name="Locate Office" message="Find directions to our nearest office" nextView="{views.Locate}" />
    <s:DataItem name="Contact Us" message="Let us know your thoughts!" nextView="{views.ContactUs}" />
    <s:DataItem name="About Us" message="" nextView="{views.AboutUs}" />
    </s:ArrayList></s:dataProvider>

<s:change>
navigator.pushView(event.currentTarget.selectedItem.nextView);
</s:change>

1 голос
/ 13 июля 2011

Вы можете упростить логику обработчика изменений в ответе JacobL, выполнив что-то вроде этого:

<s:List id="list1" height="100%" width="100%" change="navigator.pushView(list1.selectedItem.nextView)">
    <s:itemRenderer>
        <fx:Component>
            <s:IconItemRenderer labelField="name"/>
        </fx:Component>
    </s:itemRenderer>
    <s:dataProvider>
        <s:ArrayList>
            <s:DataItem name="Projects" message="Learn more about what we're working on" nextView="{views.Projects}" />
            <s:DataItem name="Locate Office" message="Find directions to our nearest office" nextView="{views.Locate}" />
            <s:DataItem name="Contact Us" message="Let us know your thoughts!" nextView="{views.ContactUs}" />
            <s:DataItem name="About Us" message="" nextView="{views.AboutUs}" />
        </s:ArrayList>
    </s:dataProvider>
</s:List>
1 голос
/ 29 июня 2011

Я делаю мобильное приложение в Flash Builder 4.5 для Android и iOS и использую классы itemRenderer и iconitemrenderer для составления списка опций для моего приложения.

На самом деле, на основев коде, который вы показали в своем примере, вы не используете класс ItemRenderer ;просто класс IconItemRenderer .Синтаксис, который вы видите следующим образом:

- это синтаксис, используемый для определения свойств компонента как дочерних в MXML.Он ссылается на свойство itemRenderer компонента List;он не ссылается на класс ItemRenderer.

Тем не менее, похоже, ошибка в том, что вы пытаетесь сослаться на строку clickfn="Projects", как если бы это был класс.Поэтому вы получаете ошибку преобразования типа.Если вы укажете полный путь к классу, вам повезет больше.

Кроме того, три ваших элемента не имеют clickFn;поэтому они, вероятно, будут выбрасывать похожие ошибки.

0 голосов
/ 29 июня 2011

Разобрался. вот решение:

<s:List height="100%" width="100%">
    <s:itemRenderer>
        <fx:Component>
            <s:IconItemRenderer height="100" labelField="name" 
                                iconField="photo" iconHeight="80" 
                                iconWidth="80" messageFunction="getMessage">
                <fx:Script>
                    <![CDATA[
                        import spark.components.NavigatorContent;
                        protected function getMessage(o:Object):String
                        {
                            return o.message;
                        }
                    ]]>
                </fx:Script>
            </s:IconItemRenderer>
        </fx:Component>
    </s:itemRenderer>
    <s:dataProvider>
        <s:ArrayCollection>
            <fx:Object name="Projects" photo="@Embed('libs/ProjectsIcon2.png')" message="Learn more about what we're working on">
            </fx:Object>
            <fx:Object name="Locate Office" photo="@Embed('libs/google-maps-icon.png')" message="Find directions to our nearest office">
            </fx:Object>
            <fx:Object name="Contact Us" photo="@Embed('libs/gmailicon.png')" message="Let us know your thoughts!">
            </fx:Object>
            <fx:Object name="About Us" photo="@Embed('libs/info-icon.png')" message="">
            </fx:Object>
        </s:ArrayCollection>
    </s:dataProvider>
    <s:change>
              //these if statements were the solution i used. rough, but works well
        <![CDATA[
            if(event.currentTarget.selectedItem.name == "Projects"){navigator.pushView(Projects);}
        if(event.currentTarget.selectedItem.name == "Locate Office"){navigator.pushView(Locations);}
        if(event.currentTarget.selectedItem.name == "Contact Us"){navigator.pushView(Contact);}
        if(event.currentTarget.selectedItem.name == "About Us"){navigator.pushView(About);}
        ]]>
    </s:change>
</s:List>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...