钛和钛合金 - 临时窗口在被杀时关闭整个应用程序

时间:2016-11-04 09:23:41

标签: javascript titanium appcelerator titanium-alloy

我打开了2个窗口,一个主窗口;和一个“弹出”加载窗口,应该只显示片刻。

当我尝试

loading.close();

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

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绑定正确且有效(如果我不首先打开加载)

2 个答案:

答案 0 :(得分:1)

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

然后你同时打开两个窗口。试图像这样连续打开两个窗口可能会给你一个竞争条件。如上所述,确保在打开任何叠加窗口之前打开第一个窗口。

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

因此,在打开任何其他内容之前,请务必确保您的第一个窗口已“完成”。听取开放事件然后打开叠加。

现在,如果您希望它看起来不错,您可能希望在XML文件中指定具有两个视图的主窗口。从列表窗口中的“隐藏”开始,然后在叠加层上显示“显示”。这样你就可以随时转移。然后,您可以根据需要重复使用叠加“进度”窗口。

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

希望这对你有意义......

答案 1 :(得分:0)

你可以尝试的一件事就是听#34;打开"在打开第二个窗口之前在主窗口上触发的事件。当我不等窗户打开时,我有类似的奇怪行为。