objective-c cocoa nstableview nsscrollview

objective c - ¿Cómo hacer que NSTableView se desplace a la última fila agregada?



objective-c cocoa (4)

Estoy agregando filas dinámicamente a un NSTableView. Cuando emito [table reloadData] puedo ver el movimiento de la vista de desplazamiento y, si lo muevo a mano, puedo ver el nuevo valor en la tabla. Pero, ¿cómo puedo desplazarlo automáticamente?


Lo resolví como se muestra a continuación, usando didAddRowView para que funcione correctamente: Obviamente, si agrego un nuevo registro, la vista de tabla debe crear una nueva vista de fila.

- (void)tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row { // it sends notification from all tableviews. // I am only interested in the dictionary... if (tableView == dictTableView){ if ( row == [dictTableView numberOfRows]-1){ [dictTableView scrollRowToVisible:row]; } }

}

Pero también, en mi IBAction agregué 2 líneas después de realizar la declaración de agregar al controlador

- (IBAction)addNewDictItem:(id)sender { NSInteger row=[[theDictArrayController arrangedObjects]count]; [theDictArrayController add:sender]; [dictTableView noteNumberOfRowsChanged]; [dictTableView scrollRowToVisible:row-1];

}


Una solución mejorada a mi anterior se muestra a continuación. Es probable que la captura del evento "didAddRow" aún sea demasiado pronto, por lo que la nueva fila (para desplazarse a ...) aún no está disponible.

Primero, cree su propia acción "agregar", mantenga una marca como recordatorio y llame a la acción agregar del controlador.

-(IBAction)addNewDictItem:(id)sender { [theDictArrayController add:sender]; dictElementAdded=TRUE; }

Ahora, cuando el controlador agrega un objeto, selecciona este objeto automáticamente. Simplemente "suba" este evento capturando la notificación de la vista de tabla. Lo bueno es que las líneas y vistas se crean antes, y la nueva fila está lista para ser seleccionada.

-(void)tableViewSelectionDidChange:(NSNotification *)aNotification { NSTableView * tableView=[aNotification object]; if (dictElementAdded && tableView == dictTableView ){ NSInteger row= [[tableView selectedRowIndexes ] firstIndex ]; [dictTableView scrollRowToVisible:row]; dictElementAdded = FALSE; } }


Usa algo como esto:

[table scrollRowToVisible:indexOfNewRow];


NSInteger numberOfRows = [tableView numberOfRows]; if (numberOfRows > 0) [tableView scrollRowToVisible:numberOfRows - 1];

Suponiendo que está agregando filas al final de la tabla.

(La razón por la que pido a la vista de tabla el número de filas en lugar de la fuente de datos es que se garantiza que este número es el número de filas que conoce y en las que puede desplazarse).