我正在使用Titanium构建iOS应用。我试图在tableView中显示一个按字母顺序排列的列表。当选择特定行时,我想将行信息传递给新窗口。我的代码按字母顺序在带有标题的组中显示列表,我有一个按字母顺序排列的滚动条,当选择一个字母时,列表会移动到该字母。但是,当选择任何行时,它们都会发送数据库中最后一行的信息。我认为我需要在文本属性的行中有一个title元素,然后我可以有一个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);
答案 0 :(得分: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);
}
});
答案 1 :(得分:0)
错误的标题完全是由于引用了“title”变量。相反,您应该使用e.rowData或e.index来确定单击了哪一行。 “title”将始终是您创建的最后一个标题。
考虑以下示例,以更简单的方式演示您的错误和解决方案。请注意,在函数调用中包装创建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();