【问题标题】:How to make NSTableView scroll to most recently added row?如何让 NSTableView 滚动到最近添加的行?
【发布时间】:2023-03-08 15:54:02
【问题描述】:

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

【问题讨论】:

    标签: objective-c cocoa nstableview nsscrollview


    【解决方案1】:
    NSInteger numberOfRows = [tableView numberOfRows];
    
    if (numberOfRows > 0)
        [tableView scrollRowToVisible:numberOfRows - 1];
    

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

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

    【讨论】:

    • 不知何故(在最新的 XCode 和 SDK 上)这会导致 tableView 滚动到单元格就在新添加的单元格(添加在 tableView 的末尾)。不知道为什么。
    • 这可能取决于你多久调用它;也许尝试在它之前添加[tableView noteNumberOfRowsChanged];
    • 谢谢,会试试的。现在我通过将[tableView reloadData] 放在它前面来让它工作。
    【解决方案2】:

    使用这样的东西:

     [table scrollRowToVisible:indexOfNewRow];
    

    【讨论】:

    • +1 因为这种方式可以处理通常的情况,即表格排序意味着新行不一定位于表格的底部。
    【解决方案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 中,我在向控制器执行 add 语句后添加了 2 行

    - (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;
       }
      

      现在,当控制器添加一个对象时,它会自动选择这个对象。 只需通过从 tableview 捕获通知来“跳上”此事件。 这样做的好处是:线和视图是之前创建的,并且新行已准备好被选择。

      -(void)tableViewSelectionDidChange:(NSNotification *)aNotification {
      NSTableView * tableView=[aNotification object];
      
      if (dictElementAdded && tableView == dictTableView  ){
          NSInteger   row= [[tableView selectedRowIndexes ] firstIndex ];        
              [dictTableView scrollRowToVisible:row];
              dictElementAdded = FALSE;
       }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-21
        • 2021-09-13
        • 2013-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多