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