2013-08-06 3 views
0

iOS 용 티타늄 모바일 앱을 제작 중입니다. 나는 3 개의 다른 스크린을 언급 할 것이다; 테이블 뷰가있는 홈 화면, "검색 필드"와 "세부 사항"화면이있는 "마스터"화면.티타늄 앱이 여러 번 검색시 하위보기를 예약합니다.

홈 화면에서 마스터 화면으로 이동하면 사용자에게 검색 필드와 메시지가 표시됩니다. 사용자가 검색 필드에 단어를 입력 할 때 메시지를 제거하고 표를 그린 다음 원격 서버에서 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'); 
    } 
}); 

?

답변

1

나는 이것이 클릭 이벤트 리스너 때문이라고 생각합니다.

코드로 돌아가서 다시 채울 때마다 다른 수신기가 추가됩니다. 그래서 두 번째로 함수를 두 번 실행 한 다음 세 번 반복합니다.

다시 올리지 않으려면 onLoad 함수를 클릭하거나 제거 할 때 청취자를 제거해야합니다.

Martyn

관련 문제