如何让NSTableView滚动到最近添加的行?

时间:2009-11-25 20:27:37

标签: objective-c cocoa nstableview nsscrollview

我正在动态地向NSTableView添加行。当我发出[table reloadData]时,我可以看到滚动视图移动,如果我手动移动它,我可以看到表上的新值。但是如何自动滚动它?

4 个答案:

答案 0 :(得分:39)

NSInteger numberOfRows = [tableView numberOfRows];

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

假设您要在表格的末尾添加行。

(我问表格视图的行数而不是数据源的原因是这个数字保证是它知道的行数并且可以滚动到。)

答案 1 :(得分:18)

使用类似的东西:

 [table scrollRowToVisible:indexOfNewRow];

答案 2 :(得分:1)

我解决了它,如下所示,使用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中,我在向控制器执行add语句后添加了2行

- (IBAction)addNewDictItem:(id)sender {
NSInteger row=[[theDictArrayController arrangedObjects]count];

[theDictArrayController add:sender];
[dictTableView noteNumberOfRowsChanged];
[dictTableView scrollRowToVisible:row-1];

}

答案 3 :(得分:0)

我之前的改进解决方案如下所示。捕获“didAddRow”事件可能还为时尚早,因此新行(滚动到...)尚不可用。

首先,创建自己的“添加”操作,将标记保留为提醒并调用控制器的添加操作。

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

现在,当控制器添加一个对象时,它会自动选择该对象。 通过从tableview中捕获通知,“跳上”此事件。 关于它的好处:之前创建了行和视图,并且可以选择新行。

-(void)tableViewSelectionDidChange:(NSNotification *)aNotification {
NSTableView * tableView=[aNotification object];

if (dictElementAdded && tableView == dictTableView  ){
    NSInteger   row= [[tableView selectedRowIndexes ] firstIndex ];        
        [dictTableView scrollRowToVisible:row];
        dictElementAdded = FALSE;
 }
}