0

iOS用のTitaniumモバイルアプリを構築しています。3 つの異なる画面について説明します。テーブルビューを持つホーム画面、「検索フィールド」を持つ「マスター」画面、および「詳細」画面。

ホーム画面からマスター画面に移動すると、ユーザーに検索フィールドとメッセージが表示されます。ユーザーが検索フィールドに単語を入力すると、メッセージを削除してテーブルを描画します。次に、リモート サーバー上の PHP ファイルを呼び出して、データベースでその単語を検索し、結果を JSON として返し、そのテーブルに表示します。ユーザーが結果の 1 つを選択すると、詳細画面が表示されます。そのすべてが意図したとおりに機能します。

この問題は、ユーザーがマスター ページに戻って別のクエリを実行したときに発生します。テーブルデータをクリアするボタンがあり、そのボタンはテーブルを効果的にクリアします。ただし、2 番目の検索の結果が表示され、いずれかを選択して詳細ページを表示すると、アプリは詳細画面を表示するように見えますが、その画面は引き続きスライド オフし、2 番目の詳細画面がスライドしてデータを表示します。

ユーザーがマスター ページに戻って 3 番目のクエリを実行すると、この同じ問題が倍増します。ここでもテーブルに結果が入力されますが、ユーザーが 1 つを選択すると、ユーザーにデータが表示される前に 2 つの詳細画面がスライドします。

上記と同じ方法で別のクエリを実行すると、ユーザーにデータが表示される前に 3 つの詳細画面がスライドします。

このパターンは、ユーザーがホーム画面に戻るまで詳細画面を増やし続けます。その後、すべてがリセットされたように見えます。コードのスニペットを次に示します。

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

これは、クリックイベントリスナーが原因だと思います。

コードに戻って再設定すると、別のリスナーが追加されます。したがって、2 回目は関数を 2 回実行し、次に 3 回実行します。

クリックしてリスナーを削除するか、 onLoad 関数からリスナーを削除して、毎回再追加されないようにする必要があります

マーティン

于 2013-08-06T14:54:39.040 に答える