2010-04-27 11 views
13

Estoy desarrollando una aplicación de iPhone en Titanium, y necesito agregar una fila a un particular TableViewSection. No puedo hacer esto al cargar la página, ya que el usuario lo hace de forma dinámica durante todo el ciclo de vida de la aplicación. La documentación dice que TableViewSection tiene un método add que toma dos argumentos, pero no puedo hacerlo funcionar. Aquí está mi código existente:¿Cómo agregar una fila a una TableViewSection en Titanium?

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

que está justo pasando un argumento en, y que provoca titanio a morir con una excepción no capturada:

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: (

La excepción parece que hizo añadir la fila, pero no está permitido por alguna razón. Dado que la documentación dice que TableViewSection toma en "vista" y "fila", He intentado lo siguiente:

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

El código anterior no arroja la excepción, pero da una [WARN]:

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

TableViewSections no parece ser compatible con ningún método como appendRow, o insertRow, por lo que no sé a dónde más ir con esto. He consultado la aplicación KitchenSink, pero no hay ejemplos que pueda encontrar para agregar una fila a TableViewSection. Cualquier ayuda es apreciada.

Respuesta

1

¿Ha intentado crear la vista fuera del método de agregar? Parece que puede ser un problema de constructor.

Intente crear una vista genérica fuera del ciclo for para ver si eso le permite pasar el mensaje de advertencia.

4

He luchado con este problema a mí mismo y después de mucho ensayo y error descubrí que la fijación de los datos sobre la TableView encerrando del TableViewSection es lo que es necesario:

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

Buena suerte!

0

Lo que dijo la rebobinadora funciona bien. Aquí hay un truco similar que funciona, presentado en una forma más simple. Incluir la declaración siguiente (aparentemente tonta) después de haber agregado la nueva fila a la TableViewSection:

$.table.data = $.table.data 

HTH

Cuestiones relacionadas