我正在为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');
}
});
此代码中的错误在哪里导致它产生我上面解释的问题?
答案 0 :(得分:1)
我认为这是因为您的点击事件监听器。
每当您返回代码并重新填充时,您都会添加另一个侦听器。所以第二次运行该函数两次,然后是3次等。
您应该在点击时删除侦听器,或者从onLoad函数中删除它,以便每次都不会重新添加它
马丁