0

我正在为 iOS 构建一个 Titanium 移动应用程序。我将提到三个不同的屏幕;主屏幕有一个表格视图,一个“主”屏幕有一个“搜索字段”和一个“详细”屏幕。

当我从主屏幕导航到主屏幕时,用户会看到一个搜索字段和一条消息。当用户在搜索字段中键入一个单词时,我删除消息并绘制一个表格,然后我调用远程服务器上的一个 PHP 文件来搜索该单词的数据库并将结果作为 JSON 返回并显示在该表格中。当用户选择其中一个结果时,将显示详细信息屏幕。所有这些都按预期工作。

当用户返回到母版页并执行另一个查询时,就会出现此问题。我有一个清除表格数据的按钮,该按钮有效地清除表格。但是,当显示第二次搜索的结果并选择查看详细信息页面时,应用程序会显示详细信息屏幕,但该屏幕继续滑出,第二个详细信息屏幕滑上并显示数据。

如果用户返回到母版页并执行第三个查询,同样的问题会成倍增加。表格再次填充了结果,但是当用户选择一个时,在向用户呈现数据之前会滑过两个详细信息屏幕。

如果以与上述相同的方式执行另一个查询,则在向用户呈现数据之前会滑过三个详细信息屏幕。

这种模式会继续增加细节屏幕,直到用户返回主屏幕。然后一切似乎都重置了。这是代码片段:

var win = Titanium.UI.currentWindow; 
var appsponsor = Ti.UI.createButton({});
win.add(appsponsor);
appsponsor.addEventListener('click',function(e){});

var customSearchBar = Ti.UI.createView({});

var customSearchField = Ti.UI.createTextField({});
customSearchBar.add(customSearchField);
win.add(customSearchBar);

var nolist= Ti.UI.createLabel({});
win.add(nolist);

var businessowner = Ti.UI.createLabel({});
win.add(businessowner);

var view = Ti.UI.createView({});
var table = Ti.UI.createTableView({});
view.add(table);

var message = Ti.UI.createLabel({});    

    var clear = Ti.UI.createButton({
        title: "Clear",
        style:Titanium.UI.iPhone.SystemButtonStyle.BORDERED
        });
        clear.addEventListener("click", function() {
            message.hide();
            table.setData([]);
            tableData = [];
        }); 
Ti.UI.currentWindow.setRightNavButton(clear);

var tableData = [];

function checkInternetConnection(){
return Ti.Network.online ? true : false;
}
customSearchField.addEventListener("return", function(e) {

if(checkInternetConnection()){
    nolist.hide();
    businessowner.hide();
    win.add(view);
    var url = "http://mydomain.com/dir/file.php?title="+e.value;
    var xhr = Ti.Network.createHTTPClient({
        onload: function() {
            Ti.API.debug(this.responseText);
            var json = JSON.parse(this.responseText);
                if (json.cms_list.length< 1){ 
                    win.add(message);
                    }
                for (i = 0; i < json.cms_list.length; i++) {
                    client = json.cms_list[i];
                    row = Ti.UI.createTableViewRow({});
                        var clientlist = Ti.UI.createLabel({});
                    row.add(clientlist);
                    tableData.push(row);
                    }
                    table.addEventListener('click',function(e){
                        var row = e.row;
                        var clientlist = row.children[0];
                            var win = Ti.UI.createWindow({
                                url: 'clientdetail.js', 
                                title: clientlist.text  
                                }); 
                        var clientlist = clientlist.text;
                        win.clientlist = clientlist;
                        Ti.UI.currentTab.open(win,{animated:true});
                        }); 
                    table.setData(tableData);
        },

        onerror: function(e) {
            Ti.API.debug("STATUS: " + this.status);
            Ti.API.debug("TEXT:   " + this.responseText);
            Ti.API.debug("ERROR:  " + e.error);
            alert('There was an error retrieving the remote data. Try again.');
            },
        timeout:5000

        });

    xhr.open("GET", url);
    xhr.send();
    }
else{
    alert('Your internet connection is not available');
    }
});

我在这段代码中的错误在哪里导致它产生了我上面解释的问题?

4

1 回答 1

1

我认为这是因为您的单击事件侦听器。

每当您返回代码并重新填充时,您就是在添加另一个侦听器。所以第二次它运行这个函数两次,然后是 3 次等等。

您应该在单击时删除侦听器或将其从 onLoad 函数中删除,以免每次都重新添加它

马丁

于 2013-08-06T14:54:39.040 回答