13

我正在 Titanium 中开发 iPhone 应用程序,并且需要将一行附加到特定的TableViewSection。我无法在页面加载时执行此操作,因为它是由用户在应用程序的整个生命周期中动态完成的。文档说 TableViewSection 有一个带有add两个参数的方法,但我不能让它工作。这是我现有的代码:

for(var i = 0; i <= product_count; i++){
    productsTableViewSection.add(
        Ti.UI.createTableViewRow({
            title:'Testing...'
        })
     );
}

那只是传入一个参数,这会导致 Titanium 因未捕获的异常而死:

2010-04-26 16:57:18.056 MyApplication[72765:207] *** Terminating app due to uncaught 
exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in 
section 2. The number of rows contained in an existing section after the update (2) must be 
equal to the number of rows contained in that section before the update (1), plus or minus the 
number of rows inserted or deleted from that section (0 inserted, 0 deleted).'
2010-04-26 16:57:18.056 MyApplication[72765:207] Stack: (

该异常看起来确实添加了行,但由于某种原因不允许这样做。由于文档说TableViewSection需要“视图”和“行”,我尝试了以下方法:

for(var i = 0; i <= product_count; i++){
    productsTableViewSection.add(
        Ti.UI.createView({}),
        Ti.UI.createTableViewRow({
            title:'Testing...'
        })
     );
}

上面的代码没有抛出异常,但它给出了一个[WARN]

[WARN] Invalid type passed to function. expected: TiUIViewProxy, 
was: TiUITableViewRowProxy in  -[TiUITableViewSectionProxy add:] (TiUITableViewSectionProxy.m:62)

TableViewSections 似乎不支持任何方法,如appendRow, 或insertRow,所以我不知道还有什么可以用的。我查看了 KitchenSink 应用程序,但没有找到向 TableViewSection 添加行的示例。任何帮助表示赞赏。

4

3 回答 3

4

我自己已经解决了这个问题,经过大量试验和错误后,我发现在 TableViewSection 的封闭 TableView 上设置数据是必要的:

var win = Ti.UI.currentWindow;
var tableview = Ti.UI.createTableView();
var sec1 = Titanium.UI.createTableViewSection();
var sec2 = Titanium.UI.createTableViewSection();
var data = [];

for(var v=0; v<=10; v++) {
    var row = Ti.UI.createTableViewRow({
        title:'Section 1 row '+v,
        className:'sectionrow'
    });
    sec1.add(row);
}
for(var c=0; c<=10; c++) {
    var row = Ti.UI.createTableViewRow({
        title:'Section 2 row '+c,
        className:'sectionrow'
    });
    sec2.add(row);
}

data[0] = sec1;
data[1] = sec2;
tableview.data = data;

win.add(tableview);

setTimeout(function() {
    alert('Adding additional rows to section 1');
    for(var x=0; x<=5; x++) {
        var row1 = Ti.UI.createTableViewRow({
            title:'Section 1 additional row '+x,
            className:'sectionrow'
        });
        sec1.add(row1);
    }
    alert('Adding additional rows to section 2');
    for(var y=0; y<=5; y++) {
        var row2 = Ti.UI.createTableViewRow({
            title:'Section 2 additional row '+y,
            className:'sectionrow'
        });
        sec2.add(row2);
    }
    // this is the line that makes the magic happen!
    tableview.data = data;
}, 3000);

祝你好运!

于 2010-11-07T19:08:29.143 回答
1

您是否尝试过在 for add 方法之外创建视图?看来这可能是构造函数问题。

尝试在 for 循环之外创建一个通用视图,看看是否可以让您通过警告消息。

于 2010-04-29T13:51:46.773 回答
0

复卷机所说的效果很好。这是一个类似的有效技巧,以更简单的形式呈现。将新行添加到 TableViewSection 后,包括以下(看似愚蠢的)语句:

$.table.data = $.table.data

高温高压

于 2013-03-03T21:28:10.327 回答