2010-10-20 11 views
13

Soy nuevo en la Mac. Estoy tratando de actualizar una celda en particular en NSTableView sin utilizar -reloadData, como -reloadData actualiza toda la tabla. Lo intenté todo, pero todo fue en vano. Estoy tratando de hacer algo similar a lo que solíamos hacer en CListCtrl en MFC o en .NET.¿Cómo actualizar NSTableView sin usar -reloadData?

+1

quiero aclarar un poco más, no me No quiero que la mesa sea redibujada. Quiero algún método en el que pueda pasar row_number, column_number o NSTableColumn, y el objeto de datos (id). – Omayr

+10

@ Mike Abdullah me hubiera gustado que tenían propuesto una solución en lugar! – Omayr

+3

Al unirse a una comunidad, generalmente es una buena idea tomar nota y adoptar las convenciones de esa comunidad. En el caso de la comunidad de desarrolladores de Mac, decir "MAC" tiende a indicar ignorancia de la plataforma. –

Respuesta

27

Tenga una mirada en reloadDataForRowIndexes:columnIndexes: método. Para actualizar una única celda, la siguiente debe funcionar:

[yourTable reloadDataForRowIndexes:[NSIndexSet indexSetWithIndex:row] 
        columnIndexes:[NSIndexSet indexSetWithIndex:column]]; 
+0

Enlace de documentos: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTableView_Class/Reference/Reference.html#//apple_ref/occ/instm/NSTableView/reloadDataForRowIndexes:columnIndexes: –

+0

Si bien esta es la solución correcta, se debe mencionar que reloadData() simplemente vuelve a presentar las celdas visibles actualmente y no toda la tabla. – Matt

-3

Por lo general, la actualización de toda la tabla a través de reloadData: es el patrón de diseño correcto. ¿Por qué eres reacio a hacerlo? ¿Es por razones de eficiencia, o está confiando en la tabla para guardar algún estado y volver a cargar todos los datos interfiere con eso? Este último suele ser un signo de que debe replantearse su arquitectura.

+2

Quiero hacer esto debido a la eficiencia.Al igual que necesito actualizar 8-10 celdas por segundo, en este caso no quiero que toda la tabla se actualice una y otra vez. – Omayr

18

Esta es una diferencia fundamental entre la forma en vistas suelen trabajar en cacao y cómo funcionan en algunos otros marcos. NSTableView lo expone una API -reloadDataForRowIndexes:columnIndexes:, como señala Vladimir, pero se dará cuenta de la ausencia de un "withObject:" parámetro.

Esto se debe a que las vistas y los controles de Cocoa son y no diseñados para que también actúen como contenedores de datos. Por el contrario, son para la presentación y la interacción de datos gestionados por algún otro objeto modelo, generalmente a través de un controlador intermedio de algún tipo.

Dada una vista de tabla, por ejemplo, si el modelo ha informado a su controlador que algunos datos en particular ha cambiado, el controlador puede invalidar la parte visualizada de la tabla que asigna a ese valor - si hay aun es una muestra porción de la mesa. La próxima vez que se dibuje, la tabla solicitará a su fuente de datos (el controlador) los valores que presentará para el área que necesita volver a dibujar.

Por lo tanto a pesar de la similitud superficial en la interacción del usuario, es probable que desee volver a examinar la forma de escribir el código para implementar la interfaz de usuario. Al final, terminará con un código de estilo Model-View-Controller mucho más detallado; El precio es que tendrá que representar realmente su modelo más a fondo de lo que podría haberlo hecho en marcos que no requirieran tal separación de preocupaciones.

1

un ejemplo completo de la utilización de reloadDataForRowIndexes para actualizar todas las filas, pero sólo una sola columna:

int col = 2 ; 
[self.myTable reloadDataForRowIndexes: 
    [NSIndexSet indexSetWithIndexesInRange: 
     NSMakeRange(0,self.myTable.numberOfRows)] 
    columnIndexes: 
     [NSIndexSet indexSetWithIndex:col] 
]; 

o todas las columnas de una sola fila:

int row = 2 ; 
[self.myTable reloadDataForRowIndexes: 
    [NSIndexSet indexSetWithIndex:row] 
columnIndexes: 
    [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.myTable.numberOfColumns)] 
]; 
+0

En su segundo ejemplo, 'reloadDataForRowIndexes: columnIndexes:' no puede tomar un NSRange, por lo que debe hacer algo como: '[NSIndexSet indexSetWithIndexesInRange: NSMakeRange (0, _tableView.numberOfColumns)]' – TheNextman

Cuestiones relacionadas