2013-04-08 67 views
3

我正在使用Titanium構建iOS應用程序。我正在嘗試在tableView中顯示按字母順序排列的列表。當選擇特定行時,我想將行信息傳遞到新窗口。我的代碼按照字母順序顯示列表,並且我有一個按字母順序排列的滾動條,當選擇一個字母時,列表將移動到那個字母上。但是,選擇任何行時,它們都會發送數據庫中最後一行的信息。我認爲我需要在文本屬性的行中有一個標題元素,然後我可以有一個tableview.addEventListener抓住該標題並傳遞它,但它不起作用。這裏是我使用的代碼,如果有人可以請看一下,看看我哪裏出錯了,這將不勝感激。意外事件監聽器結果返回

var db = (function() { 
var api = {}; 
    api.all_item_names = function() { 
     var conn = Ti.Database.install('mydb.sqlite','clients'); 
     var results = []; 
     var resultSet = conn.execute('select * from clients order by clientname asc'); 
     while (resultSet.isValidRow()) { 
      results.push({ 
      clientname: resultSet.fieldByName('clientname'), 
     }); 
     resultSet.next(); 
    } 
    resultSet.close(); 
    return results; 
}; 
return api; 
}()); 

var tvrow; 
var curheader = 'A'; 
var list = []; 
var index = []; 
var data = []; 
var isAndroid = (Titanium.Platform.name == 'android'); 

list = (db.all_item_names()); 

for (var ipos=0; ipos<list.length;ipos++){ 
    if(list[ipos].clientname[0] != curheader){ 
     curheader = list[ipos].clientname[0]; 

     tvrow = Titanium.UI.createTableViewRow({ 
      height: 40, 
      path:'clientdetail.js' , 
      client: list[ipos], 
      header: curheader 
      }); 
     index.push({title:curheader, index:ipos}); 
    } else { 
     tvrow = Titanium.UI.createTableViewRow({ 
      height:40, 
      path:'clientdetail.js' , 
      client: list[ipos]}); 
     } 

var title= Titanium.UI.createLabel({ 
    left: 5, 
    top:  2, 
    height: 40, 
    color: '#000', 
    font: {fontSize: 16, fontWeight: 'bold', fontFamily: (isAndroid?'sans-serif':'Helvetica Neue')}, 
    text: list[ipos].clientname }); 
    tvrow.add(title); 
    data.push(tvrow); 
} 

var tableView = Titanium.UI.createTableView({ 
    data:   data, 
    index:   index, 
    backgroundColor:'transparent', 
    separatorStyle: Titanium.UI.iPhone.TableViewStyle.GROUPED, 
    top:    1, 
    width:   '99%' 
}); 

tableView.addEventListener('click', function(e) 
    { 
     if (e.rowData.path) 
     { 
      var win = Ti.UI.createWindow({ 
       url:e.row.path, 
       title:title.text 
      }); 

     var clientlist = title.text; 
     win.clientlist = clientlist; 
     Ti.UI.currentTab.open(win); 
    } 
}); 

win.add(tableView); 

回答

2

問題出在您使用的循環中。您正在將所有內容都分配給指數ipos,最後是list.length(或最後一個值),這就是爲什麼您總是得到那個值的原因。爲了解決這個問題,通常是一個封閉的使用量和值傳遞,就像這樣:

for (var ipos=0; ipos<list.length;ipos++){ 
(function(i){ 
    if(list[i].clientname[0] != curheader){ 
    curheader = list[i].clientname[0]; 

    tvrow = Titanium.UI.createTableViewRow({ 
    height: 40, 
    path:'clientdetail.js' , 
    client: list[i], 
    header: curheader 
    }); 
    index.push({title:curheader, index:i}); 
    } else { 
    tvrow = Titanium.UI.createTableViewRow({ 
    height:40, 
    path:'clientdetail.js' , 
    client: list[i] 
    }); 
    } 

    var title= Titanium.UI.createLabel({ 
    left: 5, 
    top:  2, 
    height: 40, 
    color: '#000', 
    font: {fontSize: 16, fontWeight: 'bold', fontFamily: (isAndroid?'sans-serif':'Helvetica Neue')}, 
    text: list[i].clientname 
    }); 
    tvrow.add(title); 
    data.push(tvrow); 
})(ipos); 
} 

編輯

我相信你很可能讓你在新的窗口中的錯題以及訪問最後可用的title。然而,您的事件偵聽器可以使用暴露的title。它位於e.row.client.clientname(儘管它可能是e.rowData..從外觀上來看),我相信,這意味着你應該訪問當前所選標題上點擊

var tableView = Titanium.UI.createTableView({ 
data:   data, 
index:   index, 
backgroundColor:'transparent', 
separatorStyle: Titanium.UI.iPhone.TableViewStyle.GROUPED, 
top:    1, 
width:   '99%' 
}); 

tableView.addEventListener('click', function(e) 
{ 
if (e.rowData.path) 
{ 
    var win = Ti.UI.createWindow({ 
    url:e.row.path, 
    title:e.row.client.clientname 
    }); 

    var clientlist = e.row.client.clientname ? e.row.client.clientname : "No client name"; 
    win.clientlist = clientlist; 
    Ti.UI.currentTab.open(win); 
} 
}); 
+0

感謝您響應Travis,但現在我的標籤稱爲title是在函數內部,當我在我的tableView.addEventListener中引用它時,找不到標題變量。我試圖把tableView和Listener放入函數中,但它也不起作用。對不起,我對如何理解我需要做的事情非常感興趣。你會再次幫助我嗎? – dnevels 2013-04-08 01:39:23

+0

@dnevels - 查看編輯 – 2013-04-08 01:52:30

+0

良好的編輯。您能否更清楚地瞭解不需要關閉的事實,並且很快建議何時應該使用關閉以及何時不應該關閉?我擔心別人會來,讀這個答案,並認爲解決方案總是引入閉包。 – 2013-04-08 04:09:28

0

的錯題完全是由於引用「標題」變量。相反,您應該使用e.rowData或e.index來確定哪個行被點擊。 「標題」將永遠是您創建的最後一個標題。

請考慮以下示例,以更簡單的方式演示錯誤和解決方案。請注意,在函數調用中創建for循環的行不會幫助您解決此問題。

var win = Ti.UI.createWindow({ backgroundColor: '#fff' }); 

var rows = [], titles = []; 
for (var i = 0; i < 20; i++) { 
    var row = Ti.UI.createTableViewRow({ height: 40 }); 
    titles.push('Title ' + i); 
    var title = Ti.UI.createLabel({ text: titles[i], textAlign: 'center', color: '#000' }); 
    row.add(title); 
    rows.push(row); 
} 

var table = Ti.UI.createTableView({ 
    data: rows 
}); 
table.addEventListener('click', function(evt) { 
    alert('WRONG: You clicked ' + title.text + '\n' 
     + 'RIGHT: You clicked ' + titles[evt.index]); 
}); 
win.add(table); 

win.open();