我打开了 2 个窗口,其中一个是主窗口;和一个“弹出”加载窗口,该窗口仅显示一小会儿。
当我尝试
loading.close();
加载屏幕时,所有窗口都会立即关闭。没有错误代码或任何东西,应用程序直接关闭,因为屏幕上没有更多 View /窗口。 但我从未关闭过主“索引” View ,所以我不明白它为什么消失。 我的主要想法是使用
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 没有解决这个问题的相关代码,或者至少我是这么认为的。它只有一个窗口和一个 ImageView ,图像每半秒改变一次,并且在关闭之前它可以完美地工作。
注释:
- 全局变量 Ti.App.dataReady 来自后台任务(另一个文件,工作正常);
- 事件 onListClick 已正确绑定(bind)并且有效(如果我不首先打开加载)
最佳答案
首先,尽量不要使用index.open,因为它指的是"file"而不是实际的窗口。确保在窗口的 tss 文件中使用 id 并使用 .open(),希望查看完整的索引 Controller 以给出更准确的答案。
然后你同时打开两个窗口。尝试像这样连续打开两个窗口可能会给你带来竞争条件。如前所述,请确保在打开任何覆盖窗口之前打开第一个窗口。
一个好建议,因为您在这里制作跨平台应用程序,所以要确保一切顺利(所有平台、iOS、Android 和 Windows 的窗口都不同)。对于 Android,第一个窗口至关重要,并且将成为根窗口。如果万一您的覆盖窗口首先完成(是的,有些事情是异步的),那么您的覆盖窗口就是根目录,根据 Android 文档,关闭它将会关闭您的应用程序。
所以,在打开其他窗口之前,请务必确保第一个窗口已“完成”。监听打开事件,然后打开覆盖。
现在,如果您希望它看起来不错,您可能需要在 XML 文件中指定具有两个 View 的主窗口。首先在列表窗口上“隐藏”,在叠加窗口上“显示”。这样你就可以随时转移。如果您愿意,您可以重复使用叠加的“进度”窗口。
在我的应用程序中,我在小部件中使用 View ,因此我不必使用显示/隐藏,这样我也可以重用它。我想这是一个风格问题(除非我们开始讨论内存占用)
希望这对您有意义......
关于javascript - 钛和合金 - 临时窗口被杀死时会关闭整个应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40419058/