Titanium & Alloy - 临时 window 在被杀死时关闭整个应用程序

Titanium & Alloy - temporary window closes entire app when killed

我有2个windows开,一个主用;和 "popup" 加载 window 应该只显示几分钟。

当我尝试

loading.close();

加载屏幕,所有 windows 立即关闭。没有错误代码或任何东西,应用程序直接关闭,因为屏幕上没有更多 views/windows。 但是我从来没有关闭主 "index" 视图,所以我不明白为什么它会消失。 我的主要想法是使用

loading.hide();

为了隐藏加载屏幕并允许其余部分继续,但是当隐藏执行时,应用程序不会触发或响应任何事件,直到手动强制关闭。


多一点代码:

index.js

var loading = Alloy.createController("loading").getView();

function updateMainMenu() {
    if (Ti.App.dataReady){  

        //Actually create the main menù, only if data is available.
        //Cut out of snippet due to sheer length.
        //When menù is complete, close the loading window.

        loading.close();  //##### THIS CLOSES ENTIRE APP #####
    }            
}

//##### IF LOADING IS HIDDEN INSTEAD, EVENTS NEVER TRIGGER #####
//When a list element is clicked open the corresponding page.  
function onListClick(e) {
    var win = Alloy.createController('controlPage', e.row.data).getView();
    win.open();
}

//Loads the View, displays it and keeps it updated.
$.index.open(); 
loading.open();
setInterval(updateMainMenu, 2000); 

loading.js/tss/xml 没有关于这个问题的相关代码,至少我是这么认为的。它只有一个 window 和一个图像每半秒更改一次的 imageView,并且在关闭之前它可以正常工作。

备注:

您可以尝试的一件事是在您打开第二个 window 之前收听在主 window 上触发的 "open" 事件。当我不等待 window 打开时,我有过类似的奇怪行为。

首先,尽量不要使用 index.open,因为它指的是 "file" 而不是实际的 window。确保在 tss 文件中为 window 使用 id 并使用那个 .open(),希望看到您的完整索引控制器以提供更准确的答案。

然后你同时打开两个windows。尝试像这样连续打开两个 windows 可能会给您带来竞争条件。如前所述,在打开任何覆盖 window.

之前,请确保您的第一个 window 已打开

一个很好的建议,因为你在这里制作跨平台应用程序是为了确保一切(windows 对于所有平台都是不同的,iOS,Android 和 Windows).对于 Android,第一个 window 是关键的,将成为根 window。如果有任何机会你的覆盖 window 首先完成(是的,有些事情是异步的)那么你的覆盖是根,关闭它会根据 Android 文档关闭你的应用程序。

所以,在打开其他任何东西之前,请始终确保您的第一个 window 是 "done"。侦听打开事件,然后打开覆盖。

现在,如果您希望它看起来不错,您可能需要在 XML 文件中指定带有两个视图的主要 window。从列表 window 上的 "hide" 和覆盖层上的 "show" 开始。这样你就可以随时换班了。然后,如果您愿意,可以重复使用叠加层 "progress" window。

在我的应用程序中,我在小部件中使用了一个视图,因此我不必使用 show/hide,这样我也可以重复使用它。我想这是一个风味问题(除非我们开始谈论内存占用)

希望这对你有意义...