0

我正在使用 Titanium SDK 2.1.3 并为 iOS 6.1 和 Android 4.0 进行开发。

我的应用程序有一个 TableView,每个 TableViewRow 代表一个文件,并且有一个名为lockedStatus 的自定义属性,它可以是true 或false,当单击一行时,根据lockedStatus 的值,会打开一个窗口,指示元素的状态行。在此窗口中,我可以将lockedStatus 从true 修改为false,反之亦然。

我遇到的问题是,在 Android 中,对此属性所做的更改将被忽略,除非完全强制应用程序停止,否则在 iOS 中不会发生这种情况。

要更改窗口中的 lockedStatus 值,我会触发如下事件:

Ti.App.fireEvent('updateLockedStatus', {
    lockedStatus : true //this can be true or false
});

那么监听器是这样的:

Ti.App.addEventListener('updateLockedStatus', function(e){
    var rows = table.data[0].rows;
    for (var i = 0; i < rows.length; i++) //iterate through the rows to look for the file
    {
        if (rows[i].fileID == currentlyEditingFile)
        {
            rows[i].updateLockedStatus(e.lockedStatus);
            files[currentlyEditingFile].lockedStatus = e.lockedStatus; //update the file lockedStatus
            rows[i].fileObject = files[currentlyEditingFile];
            saveFilesToDatabase();
        }
    }   
});

每一行都是使用 updateLockedStatus 函数生成的,该函数具有以下定义:

row.updateLockedStatus = function(lockedStatus)
{
    row.lockedStatus = lockedStatus;
}

saveFilesToDatabase 函数如下所示:

function saveFilesToDatabase()
{

    var tempFilesArray = [];

    for(var i=0;i<filesIds.length;i++)
    {
        tempFilesArray.push(files[filesIds[i]]);
    }

    Ti.App.Properties.setString('filesApp', JSON.stringify(tempFilesArray)); //save the file values in the application properties
}

我所说的被忽略的意思是,当我退出窗口并返回到带有文件表的视图时,如果我再次单击刚刚修改的文件,窗口将打开,就好像没有进行任何更改一样。

如何强制更新 TableView 中的所有内容?在 iOS 中没有问题,但在 Android 中,除非我关闭应用程序,否则不会更新。

任何帮助将不胜感激。

4

2 回答 2

0

you would take care when doing this :

Each row is generated with a updateLockedStatus function, that has the following definition:

row.updateLockedStatus = function(lockedStatus)
{
    row.lockedStatus = lockedStatus;
};

If the code above is put in a loop then executing the row.updateLockedStatus may affect only the last row because the row variable gets reused and contains at the end only the last row object. Take a look at this

You can simply use this code :

row.updateLockedStatus = function(lockedStatus)
{
    this.lockedStatus = lockedStatus;  // this is the current row
};

Or using closures, something like that :

row.updateLockedStatus = (function(r){

    return function(lockedStatus){

        r.lockedStatus = lockedStatus;   // r is the current row

    };

})(row);

the local r variable should retain the right row object.

BTW, when you listen events using Ti.App, you should use variables for handlers. Instead of doing this :

Ti.App.addEventListener('updateLockedStatus', function(e){

use this way

var updateLockedStatusHandler = function(e){
    //...
};

Ti.App.addEventListener('updateLockedStatus', updateLockedStatusHandler);

Then this could be useful to remove the handler and avoid a potential memory leak :

Ti.App.removeEventListener('updateLockedStatus', updateLockedStatusHandler);
于 2013-06-27T13:50:09.623 回答
0

尝试使用Ti.API.fireEvent&Ti.API.addEventListener而不是Ti.App

于 2013-06-27T01:34:17.090 回答