Как добавить строку в TableViewSection в титане?

Я разрабатываю приложение для iPhone в Titanium, и мне нужно добавить строку к определенному TableViewSection. Я не могу сделать это при загрузке страницы, как это было сделано динамически пользователем на протяжении всего жизненного цикла приложения. В документации указано, что TableViewSection имеет метод add, который принимает два аргумента, но я не могу заставить его работать. Вот мой существующий код:

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

Это просто передается один аргумент, и это заставляет Титана умереть с неперехваченным исключением:

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. Любая помощь приветствуется.

Ответы

Ответ 1

Я сам боролся с этой проблемой, и после многих проб и ошибок я обнаружил, что настройка данных в приложении TableView TableViewSection является необходимой:

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);

Удачи!

Ответ 2

Вы пытались создать представление вне метода add? Кажется, это может быть проблема с конструктором.

Попробуйте создать общий вид вне цикла for и посмотреть, не пройдет ли это от предупреждения.

Ответ 3

Что говорит перемотчик, хорошо работает. Вот аналогичный трюк, который работает, представленный в более простой форме. Включите следующий (казалось бы, глупый) оператор после того, как вы добавили новую строку в TableViewSection:

$.table.data = $.table.data

НТН