代码之家  ›  专栏  ›  技术社区  ›  BJ Homer

NSTableView在选择时跳转为什么?

  •  1
  • BJ Homer  · 技术社区  · 14 年前

    我得到了一个具有单个列的NSTableView,其中填充了NSTableViewDataSource方法(不涉及绑定)。NSTableView位于NSScrollView中,这是在Interface Builder中从库中拖入NSTableView时的默认行为。tableview的内容是基于用户键入的搜索字符串填充的,并且在该点之后不会更改。

    我只实现数据源协议的这两种方法:

    - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView;
    - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row;
    

    键入搜索字符串后,焦点仍在NSTextField中,但我可以使用鼠标滚轮或滚动条上的箭头自然地滚动tableview。两者都不会导致tableview接收焦点环。但是,如果向下滚动使我不在tableview的顶部,然后单击以高亮显示tableview中的某一行,则tableview将跳回顶部,然后选择鼠标在该点下的任何行。如果在该点之后单击行,它将按预期工作。

    换句话说,如果NSTableView周围有焦点环,则单击一行会高亮显示所需的行。如果它周围没有焦点环,则在滚动到顶部后,单击一行可选择该位置上的任何行。

    2 回复  |  直到 14 年前
        1
  •  2
  •   ig2r    14 年前

    NSTextField 失去了焦点,它不知怎的引发了 reloadData (或类似的方法),哪个方法会清空视图(将其滚动位置重置为顶部),然后立即重新填充它?

        2
  •  0
  •   w0mbat    9 年前

    我曾经有过一个类似的错误,原因是我的窗口控制器正在处理awakeFromNib,并且正在设置列表上的滚动位置,以便它在第一次加载时处于正确的位置。然而,我最终意识到,它也在从基于nib的表视图单元格中获得nib消息,这些单元格是根据需要创建的,有时在滚动时会意外地弄乱表滚动值。我的解决办法是让窗口控制器在处理第一个awakeFromNib时只设置滚动位置。