25

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

4

4 回答 4

44
NSInteger numberOfRows = [tableView numberOfRows];

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

假设您将行添加到表的末尾。

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

于 2009-11-25T20:40:10.080 回答
19

使用这样的东西:

 [table scrollRowToVisible:indexOfNewRow];
于 2009-11-25T20:34:50.760 回答
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];

}

于 2016-06-12T13:45:27.543 回答
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;
 }
}
于 2017-03-17T17:32:05.700 回答