【发布时间】:2023-03-08 15:54:02
【问题描述】:
我正在向 NSTableView 动态添加行。当我发出 [table reloadData] 时,我可以看到滚动视图移动,如果我手动移动它,我可以看到表格上的新值。但是如何自动滚动呢?
【问题讨论】:
标签: objective-c cocoa nstableview nsscrollview
我正在向 NSTableView 动态添加行。当我发出 [table reloadData] 时,我可以看到滚动视图移动,如果我手动移动它,我可以看到表格上的新值。但是如何自动滚动呢?
【问题讨论】:
标签: objective-c cocoa nstableview nsscrollview
NSInteger numberOfRows = [tableView numberOfRows];
if (numberOfRows > 0)
[tableView scrollRowToVisible:numberOfRows - 1];
假设您将行添加到表的末尾。
(我向表格视图询问行数而不是数据源的原因是,这个数字保证是它知道并且可以滚动到的行数。)
【讨论】:
[tableView noteNumberOfRowsChanged];。
[tableView reloadData] 放在它前面来让它工作。
使用这样的东西:
[table scrollRowToVisible:indexOfNewRow];
【讨论】:
我解决了它,如下所示,使用 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];
}
【讨论】:
对我之前的解决方案进行了改进,如下所示。捕捉“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;
}
}
【讨论】: