Я динамически добавляю строки в NSTableView. Когда я выдаю [table reloadData], я вижу, что перемещение прокрутки перемещается, и если я перемещаю его вручную, я могу увидеть новое значение в таблице. Но как я могу прокручивать его автоматически?
Как сделать прокрутку NSTableView до последней добавленной строки?
Ответ 1
NSInteger numberOfRows = [tableView numberOfRows];
if (numberOfRows > 0)
[tableView scrollRowToVisible:numberOfRows - 1];
Предполагая, что вы добавляете строки в конец таблицы.
(Причина, по которой я запрашиваю представление таблицы для количества строк вместо источника данных, заключается в том, что этому числу гарантируется количество строк, о которых он знает, и может прокручиваться.)
Ответ 2
Используйте что-то вроде этого:
[table scrollRowToVisible:indexOfNewRow];
Ответ 3
Я решил это, как показано ниже, используя didAddRowView для правильной работы: Очевидно, что если я добавлю новую запись, tableview должен создать новый вид строки.
- (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];
}
}
}
Но также в моем IBAction я добавил 2 строки после выполнения инструкции add в контроллер
- (IBAction)addNewDictItem:(id)sender {
NSInteger row=[[theDictArrayController arrangedObjects]count];
[theDictArrayController add:sender];
[dictTableView noteNumberOfRowsChanged];
[dictTableView scrollRowToVisible:row-1];
}
Ответ 4
Улучшенное решение для моего предыдущего показано ниже. Захват события "didAddRow", вероятно, еще слишком рано, так что новая строка (для прокрутки до...) пока недоступна.
Сначала создайте собственное действие "добавить", сохраните флаг в качестве напоминания и вызовите контроллер, добавив действие.
-(IBAction)addNewDictItem:(id)sender {
[theDictArrayController add:sender];
dictElementAdded=TRUE;
}
Теперь, когда контроллер добавляет объект, он автоматически выбирает этот объект. Просто "прыгай" на этом событии, поймав уведомление из таблицы. Приятная вещь: линии и представления создаются раньше, и новая строка готова к выбору.
-(void)tableViewSelectionDidChange:(NSNotification *)aNotification {
NSTableView * tableView=[aNotification object];
if (dictElementAdded && tableView == dictTableView ){
NSInteger row= [[tableView selectedRowIndexes ] firstIndex ];
[dictTableView scrollRowToVisible:row];
dictElementAdded = FALSE;
}
}