为啥以下用于切换两个容器的可见性的代码不起作用,正确的做法是啥?
Posted
技术标签:
【中文标题】为啥以下用于切换两个容器的可见性的代码不起作用,正确的做法是啥?【英文标题】:Why does the following code for switching the visibility of two containers not work and what is the correct way of doing it?为什么以下用于切换两个容器的可见性的代码不起作用,正确的做法是什么? 【发布时间】:2014-09-19 04:32:07 【问题描述】:我正在尝试制作一个按钮,根据另一个框的状态使框可见或不可见。这是我的代码:
<?xml version="1.0" encoding="utf-8"?>
<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">
<fx:Script>
<![CDATA[
public function switchContainers():void
if ((screen1.visible = false) && (screen2.visible = true))
screen2.visible = false;
screen2.includeInLayout = false;
screen1.visible = true;
screen1.includeInLayout = true;
else
screen1.visible = false;
screen1.includeInLayout = false;
screen2.visible = true;
screen2.includeInLayout = true;
]]>
</fx:Script>
<s:SkinnableContainer id="screen1" backgroundColor="red" visible="false" includeInLayout="false" />
<s:SkinnableContainer id="screen2" backgroundColor="blue" visible="true" includeInLayout="true" />
<s:Button top="5" left="5" label="Switch containers" click="switchContainers()"/>
</s:Application>
每当我点击按钮时,什么都没有发生。我只能看到蓝色的容器。为什么这不起作用?
本练习的最终目的是在应用程序中显示不同的“屏幕”(登录屏幕、菜单屏幕等),而无需借助 ViewStack(我正在尝试仅使用 Spark 组件)。这样做的首选方式是什么?
【问题讨论】:
您忘记了函数中的参数 MouseEvent。 【参考方案1】:在您的条件语句中,在评估屏幕的可见性时,您使用的是 assignment operator (=
) 而不是 equality operator (==
)。
if ((screen1.visible = false) && (screen2.visible = true))
将其更改为等式表达式:
if ((screen1.visible == false) && (screen2.visible == true))
实现此目的的另一种方法是使用 Flex 状态系统,您可以在其中定义 screen1
和 screen2
的状态:
<s:states>
<s:State name="screen1"/>
<s:State name="screen2"/>
</s:states>
使用includeIn
属性来包含一个组件:
<s:SkinnableContainer id="screen1" includeIn="screen1" />
<s:SkinnableContainer id="screen2" includeIn="screen2" />
然后,使用changeState
属性更改状态:
currentState = "screen2";
【讨论】:
【参考方案2】:在您的 if 条件中,您使用 operator =
(赋值)为变量赋值,而不是使用 operator ==
(相等)来测试两个表达式是否相等。你的条件应该这样写:
if ((screen1.visible == false) && (screen2.visible == true))
【讨论】:
谢谢!为什么事件触发的函数必须将事件作为参数,即使它不用于处理输出? @Laura - AS3 包含一个基于文档对象模型 (DOM) 级别 3 事件规范的新事件模型。这个新版本的 ActionScript 引入了一个单一的事件处理程序,它取代了该语言以前版本的各种机制。 很抱歉,但这是不正确的 - 只有在脚本块或传统类中编写时才是强制性的,您通过 addEventListener 直接分配侦听器。 mxml 是第 3 层抽象,编译器在其中获取您的代码并将其包装在自动生成的 AS 类中。在这种确切的情况下,如果您要查看 keep-generated,您会看到相当于: clickHander_194983105212 其中调用您的内部方法 - 因此传递参数是可选的。 @Mike Petty - 感谢您的精确。以上是关于为啥以下用于切换两个容器的可见性的代码不起作用,正确的做法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
为啥这个用于 lat/long 的 Lua Haversine 代码不起作用?