禁用Flex CSS类型选择器警告?

14

我正在构建一个相当大的Flex项目,其中包括多个模块(一个生成多个SWF文件的单个Flex项目)

现在,我有一个单独的css文件,被加载到主SWF标签中:

<s:Application ... >
    <fx:Style source="css/main.css" />
...
</s:Application>
在CSS文件中:
/* CSS file */
@namespace s "library://ns.adobe.com/flex/spark";

s|Panel { 
    skinClass: ClassReference("com.skins.DefaultPanelSkin"); 
} 

s|Button {
    skinClass: ClassReference("com.skins.DefaultButtonSkin");
}

CSS文件没有在其他地方引用。

我目前有6个模块(加上主SWF,总共7个SWFs)。 我注意到警告的数量与模块数有关...每次添加一个模块,我就会得到更多的警告。 现在,对于CSS文件中的每个条目,我会收到6个警告,因此:

CSS type selectors are not supported in components: 'Panel'
CSS type selectors are not supported in components: 'Panel'
CSS type selectors are not supported in components: 'Panel'
CSS type selectors are not supported in components: 'Panel'
CSS type selectors are not supported in components: 'Panel'
CSS type selectors are not supported in components: 'Panel'

然后对于Button、TextArea等等控件重复执行相同的操作。我有太多无用的警告,这让我无法看到是否有任何有效的警告。

这个警告是由我做错了什么导致的吗?所有样式都被正确应用,并且在运行时似乎正好按照我想要的方式工作。如果我没有做错任何事情,我可以告诉编译器忽略此警告吗?

注意:我尝试了-show-unused-type-selector-warnings=false编译器标志,但它不起作用...那是针对类似但不同的警告。


添加赏金...编译时出现161个警告是无法管理的。如果有人需要,我可以生成一个简化的Flex Builder项目示例,以产生此问题。 - davr
7个回答

6
如果您看到FlexBuilder中的警告信息,您应该可以使用Eclipse的问题过滤GUI。假设Flex 4在这方面与Flex 3足够相似,在右上角的problems标签上,有一个带有工具提示“配置要应用于此视图的过滤器”的按钮,它是带箭头的那个。
在过滤器对话框中,对于默认过滤器,将描述设置为“不包含”,并在其下方的文本中输入“组件中不支持CSS类型选择器”。

1
这个可行,谢谢!在Flex 4中GUI有点不同(因为它基于更新版本的Eclipse),但是相同的基本思路适用,它在问题视图右上角的那个三角形隐藏菜单中。 - davr

2
所以最终我只是下载了编译器的源代码,搜索其中的警告信息,将其注释掉,然后重新编译了编译器。这是针对标记为gumbo beta2版本的。
Index: modules/compiler/src/java/flex2/compiler/css/StylesContainer.java
===================================================================
--- modules/compiler/src/java/flex2/compiler/css/StylesContainer.java   (revision 10941)
+++ modules/compiler/src/java/flex2/compiler/css/StylesContainer.java   (working copy)
@@ -198,11 +198,11 @@
         {
             // [preilly] This restriction should be removed once the
             // app model supports encapsulation of CSS styles.
-            ComponentTypeSelectorsNotSupported componentTypeSelectorsNotSupported =
+            /*ComponentTypeSelectorsNotSupported componentTypeSelectorsNotSupported =
                 new ComponentTypeSelectorsNotSupported(getSource().getName(),
                                                        lineNumber,
                                                        selector);
-            ThreadLocalToolkit.log(componentTypeSelectorsNotSupported);
+            ThreadLocalToolkit.log(componentTypeSelectorsNotSupported);*/
             return true;
         }

虽然不是最优美的解决方案,但那些警告确实让人很烦。


供日后参考:如果有人礼貌地请求,我可以上传已编译的编译器……但它有100MB大小,所以我不会为了安全起见上传它。 - davr

2

我发现引起这个警告的另一个原因是在类内部引用parentApplication。

我的项目有两个应用程序,有几种情况下我需要出于某种原因进入其中一个应用程序或另一个应用程序。

如果我按照以下方式引用我的parentApplication,则会看到警告:

(this.parentApplication as SomeAppName).someFunction();

如果我将引用设为general,错误就会消失:

this.parentApplication.someFunction();

这并不意味着评论这是否是好的实践,但希望能帮助一些人找到根本原因。
祝一切顺利。

我曾经遇到过这种情况,我通过创建一个接口IApp并在之前使用主模块Main的代码中使用此接口来解决它。 - Bruno Ranschaert

1
问题在于您无法在已加载的模块中定义全局样式。您可以为模块标签使用特定的样式名称,并在 CSS 中使用后代选择器将样式应用于子组件:
<mx:Module styleName='mySubStyle' .../>

在 CSS 中使用:

.mySubStyle s|Panel { color: #FF0000; }

1
我没有在加载的模块中定义全局样式,而是在我的主要、根、父级、非模块 SWF 中定义它。那是我唯一引用 CSS 文件的地方……没有任何模块有 <style> 标签或其他东西。 - davr
这只是一个警告,不是错误,但是是的,在根<s:Application>标签中导入这个的地方。 - davr
愚蠢的问题,但你有没有做过这样的事情: mx:Application mx:Panel <mx:Style blah.../> ... - sharvey
1
不,样式标签是应用程序标签内的第一件事。 - davr
如果您的主<Application>节点是Application的子类,编译器可能无法识别它是一个Application并抛出警告,这将会成为一个问题。 - quoo

0

看起来你需要为你的CSS设置命名空间:从文档中可以得知:“未经命名空间限定或未解析为链接到应用程序的ActionScript类的类型选择器会在编译时引发警告。”

他们给出的示例是:

<Style>
    @namespace "library://ns.adobe.com/flex/spark";
    @namespace cx "com.mycompany.*";

    Button { color: #990000; }
    cx|MyFancyButton { color: #000099; }
</Style>

从你的例子来看,你似乎缺少自定义命名空间,并且由于你的架构是模块化的,这些类在编译时无法解析到应用程序中。

我的CSS文件中的所有类型都使用命名空间。类型可以正确解析,样式也能够正常应用,就像我之前所说的那样。 - davr
我知道样式已经被应用了,但这与你提出的问题无关,即你收到了一个警告。 - Oliver Turner
我相信这会抛出不同的警告。 - quoo
我在继承的 Flex 3.5 项目中有 62 条“不支持 CSS 类型选择器”的消息。我根本没有给我的类型选择器加命名空间;遗憾的是,这样做对警告没有任何影响。 - supervacuo

0

如果您仍然看到这些警告,请检查是否将其中一个组件标记为要构建为应用程序?

在我的一个项目中出现了这些“不正确”的CSS类型选择器警告。我注意到Flex Builder为我的一个组件创建了一个额外的应用程序(您可以在bin-debug文件夹中检查此内容)。一旦我将该组件从应用程序中移除,警告就消失了。

请注意,该组件中没有CSS声明,并且警告显示在我的主应用程序资源中。

您可以通过转到应用程序的属性面板,打开Flex应用程序选项卡,选择组件并单击“删除”按钮来取消组件的“构建为应用程序”标记。

额外的奖励是编译时间缩短了(至少快了5倍)。


0

在项目属性中添加以下内容到编译器标志:

-show-unused-type-selector-warnings=false

我已经使用覆盖方法将我的Adobe Air SDF从3.1更新到17.0,现在它发现了10个有关CSS的警告,而我的应用程序中只有一个按钮,所以我尝试寻找解决方案,你的答案被发现并且我已经尝试了你的解决方案,但它不起作用,是否有其他解决方案可以消除这个警告? - JK Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接