【问题标题】:Flex: PopUpManager giving "...null object reference" errorFlex:PopUpManager 给出“...空对象引用”错误
【发布时间】:2012-07-08 06:53:17
【问题描述】:

我有一个调用多个 ViewStack 状态的主应用程序,每个状态都有弹出窗口。如果我不打开任何弹出窗口,我可以在状态之间移动。如果我打开一个弹出窗口,然后尝试使用 currentState=... 更改状态,我会收到错误消息:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at spark.components::Scroller/focusInHandler()[E:\dev\4.y\frameworks\projects\spark\src\spark\components\Scroller.as:2139]
at flash.display::Stage/set focus()
at mx.core::UIComponent/setFocus() [E:\dev\4.y\frameworks\projects\framework\src\mx\core\UIComponent.as:9905]
...

我看到其他人也有同样的问题,例如这里:

http://forums.adobe.com/thread/1031531

http://forums.adobe.com/message/2767130

http://forums.adobe.com/message/3448443

http://forums.adobe.com/thread/655749?tstart=-1

http://forums.adobe.com/thread/801149

http://flex4examples.wordpress.com/2011/05/05/skinnabletextbase-focusmanager-runtime-error-popup/

http://bugs.adobe.com/jira/browse/SDK-32036?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel

但我还没有弄清楚如何实施推荐的解决方案。听起来我应该只包括:

import mx.managers.PopUpManager; PopUpManager;

在我的主应用程序中,它应该可以工作,但它对我不起作用。

我的应用程序的每个视图状态都在不同的文件中,每个视图状态都使用<views:View> 定义。此外,所有弹出窗口都是定义为<s:TitleWindow> 的单独文件。每个文件都包含这一行:

import mx.managers.PopUpManager;

我想知道这是否意味着每个文件都使用不同的弹出管理器(?),当它是一个单例并且整个应用程序应该只使用一个时(如何设置?)。

我用来调用弹窗的代码是:

var _popupName:MyTitleWindowFileName = MyTitleWindowFileName(
    PopUpManager.createPopUp(this, MyTitleWindowFileName, true));   
_popupName.addEventListener(MyAppController.CLOSE_POPUP,onClosePopUp); 
PopUpManager.centerPopUp(_popupName); // call popup 

请注意,当主应用程序(定义为<s:Application>)运行时,ViewStack 状态尚未加载(因为它们在第一次使用时已加载)。不确定这是否有任何因果关系。

我尝试在此处的“将数据传入和传出 Spark 弹出窗口”部分中遵循 Adob​​e 的示例代码:

http://help.adobe.com/en_US/flex/using/WS6c678f7b363d5da52e8f1ca1124a0430dcf-8000.html#WS6c678f7b363d5da52e8f1ca1124a0430dcf-7ffe

非常感谢任何想法。

【问题讨论】:

  • 您的错误与论坛帖子中的所有其他错误不同。此外,关于在主应用程序中添加引用 PopUpManager 的评论仅适用于您使用 Flex 模块的情况。在这种情况下,当您更改状态时,滚动条正在接收焦点,并导致错误。问题:发生这种情况时,您在哪个视图(主应用程序、视图堆栈子视图或弹出窗口)中更改状态?
  • 我正在更改视图堆栈子视图中的状态。如果我打开一个弹出窗口然后更改状态并删除弹出窗口,则会发生错误。但是,如果我打开一个弹出窗口,然后选择将焦点从弹出窗口中移开的内容,例如在视图堆栈子视图中手动单击 spark DropDownList 或 TextInput,然后更改状态并删除弹出窗口,则不会发生错误。
  • @ggkmath - 你能解决这个问题吗?这与我所处的场景完全相同。打开一个弹出窗口,更改状态,然后出现错误。
  • @ggkmath - 我能够使用这里的解决方案解决这个问题stackoverflow.com/questions/11516121/…

标签: apache-flex


【解决方案1】:

根据您的 cmets,似乎发生了错误,因为焦点仍在弹出窗口中。我希望 PopUpManagerFocusManager 类能更好地处理这个问题。

我能想到的一件事是 FocusManager可能正在尝试处理这个问题。但是由于状态发生变化,当视图状态发生变化时,最初具有焦点的项目(在视图堆栈子项中,在弹出窗口打开之前)可能不再存在。只是预感,看不到您的代码。

您可以采取以下措施来解决问题(或更好地)进一步调试它以了解正在发生的事情:

  • 在关闭弹出窗口之前,使用FocusManager.setFocus() 将焦点移回视图堆栈子项中的对象

  • 使用FocusManager.getFocus() 进行调试并查看它认为焦点在各个阶段(打开弹出窗口之前、更改状态之前/之后以及关闭弹出窗口之前/之后)的位置。

【讨论】:

  • 感谢 Sunil,我今天早上一直在尝试使用 setFocus()。这个想法是以编程方式“单击”视图堆栈子项中的功能,就好像用户手动单击它一样。在离开视图堆栈之前,如果我执行myTextInputId.setFocus();,那么错误就会消失。但是,改为执行focusManager.setFocus(myButtonId); 不起作用。也不执行myLabelId.setFocus();。由于并非我的所有视图堆栈子项都有 TextInput 组件,因此不确定这是否是可接受的解决方案。我很想知道发生了什么事。
  • 注意,您的应用程序中可以有多个 FocusManager。每个人都管理自己的“标签循环”。例如,当用户按下“tab”键时,弹出窗口有它自己的 FocusManager b/c,它只会在弹出窗口中移动焦点。当您执行focusManager.setFocus(myButtonId) 时,这是来自子视图还是弹出窗口中的FocusManager
  • 我唯一一次使用 FocusManager 就是在那一行代码中。由于它位于视图堆栈子视图中(不是弹出窗口),我猜它是视图堆栈子视图的 FocusManager。
  • 嗯,您可能想发布您的代码或正在发生的事情的简单示例。听起来您需要在调试器中单步执行代码以查看失败的原因。
【解决方案2】:

看来这是我正在经历的情况:

Adobe Air: scroller throws error when changes focus between different applications

这是一个 Adob​​e 错误。 Solution from Adobe 是:

This bug is easily fixed by changing Scroller to do a null pointer check on focusManager before using it.

这是上面第一个链接尝试做的事情。

另一个链接:http://forums.adobe.com/message/3812805

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多