¿Por qué mx:states tiene problemas para resolverse en la implementación de un componente?

StackOverflow https://stackoverflow.com/questions/369120

  •  21-08-2019
  •  | 
  •  

Pregunta

De vez en cuando aparece un error cuando configuro estados en un archivo MXML.El error que recibo dice que mx:states no se pudo resolver en la implementación de un componente.

Leí, en la siguiente URL, que este problema se debe a la extensión de componentes, lo que de alguna manera altera la capacidad del compilador para resolver mx:states.No veo por qué debería ser así, pero no tengo ninguna respuesta propia.Tampoco puedo necesariamente hacer que este enfoque funcione con todos mis componentes extendidos.

http://life.neophi.com/danielr/2007/01/could_not_resolve_to_a_compone.html

La solución que se me ocurrió es no utilizar ningún espacio de nombres.Entonces, mi código se ve así:

<states>...</states>

en vez de:

<mx:states>...</mx:states>

Lo que hace que esto sea extraño (al menos para mí) es el hecho de que los hijos de la etiqueta no tienen este problema.mx:states no se puede resolver, pero su hijo mx:State sí.Y mx:SetProperty, un elemento secundario de mx:State, también se resuelve.

¿Alguien puede explicar esto y/u ofrecer una mejor solución al problema que la que se me ocurrió?

Por cierto, veo el mismo problema con mx:transitions.

¿Fue útil?

Solución

Si tiene un componente personalizado, probablemente lo tendrá en un espacio de nombres distinto de mx.Estás en el camino correcto al eliminar el espacio de nombres, pero no es necesario que lo hagas.Considere el siguiente ejemplo

<example:MyComponent xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns:example="com.example.*">
</example:MyComponent>

En ese código, tenemos un componente personalizado llamado MyComponent en el paquete com.example.Ahora, ¿cómo agregamos estados personalizados?¡Es fácil!

<example:MyComponent xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns:example="com.example.*">

    <example:states>
        <mx:State name="CustomState">
        </mx:State>
    </example:states>

</example:MyComponent>

Propiedades de un componente, como estados, transiciones, o incluso etiqueta en un botón se pueden crear como elementos secundarios.Esas propiedades deben utilizar el mismo espacio de nombres que la instancia del componente.No importa de dónde venga la propiedad en la cadena de herencia.Incluso si com.example.MyComponent extiende mx.containers.Canvas, la propiedad de estados utilizará el espacio de nombres XML en el que se define MyComponent.

En resumen, no pienses en estados propiedad como mx:estados porque el mx: El prefijo de una propiedad simplemente se hereda del componente.Sin embargo, tenemos que utilizar mx: cuando definimos el estado real en sí porque es una clase (no una propiedad) y esa clase está definida en el espacio de nombres mx.

Para ir un paso más allá en la explicación, puedes cambiar el http://www.adobe.com/2006/mxml espacio de nombres para ser algo distinto de mx.

<zzz:VBox xmlns:zzz="http://www.adobe.com/2006/mxml">
    <zzz:states>
    </zzz:states>
</zzz:VBox>

En ese ejemplo, cambiamos mx a zzz.Ahora el estados la propiedad debe tener el prefijo zzz: en lugar de mx:.

Otros consejos

<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
         width="100%" 
         height="100%"
         backgroundColor="#f7f7f7" 
         xmlns:common="com.americanexpress.voice.view.component.common.*">
    <mx:states name="edit">

¿Por qué falla esto? También he encontrado que esta falla cuando tengo varios espacios de nombres definidos. Retire la <mx: aborda el tema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top