我正在动态地将行添加到 NSTableView。当我发出 [table reloadData] 时,我可以看到滚动视图移动,如果我手动移动它,我可以看到表格上的新值。但是我怎样才能自动滚动它呢?
问问题
12023 次
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 回答