Подтвердить что ты не робот

Как сделать прокрутку NSTableView до последней добавленной строки?

Я динамически добавляю строки в NSTableView. Когда я выдаю [table reloadData], я вижу, что перемещение прокрутки перемещается, и если я перемещаю его вручную, я могу увидеть новое значение в таблице. Но как я могу прокручивать его автоматически?

4b9b3361

Ответ 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;
 }
}