2010-08-18 66 views
1

我有一个单栏NSTableView,填充NSTableViewDataSource方法(不涉及任何绑定)。NSTableView是在NSScrollView内,当您从Interface Builder中的库中拖入一个NSTableView时,NSTableView是默认行为。 tableview的内容基于用户键入的搜索字符串填充,并且在该点之后不会更改。NSTableView跳转选择...为什么?

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

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

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

换句话说,如果NSTableView有围绕它的聚焦环,点击一行就会突出显示预期的行。如果它没有围绕它的聚焦环,点击一行可以在滚动到顶部之后选择该位置的任何行。

任何见解?我运行的是雪豹,但我相信这也发生在我运行豹时。

回答

2

难道是因为当搜索NSTextField失去焦点时,它在表格视图上以某种方式触发reloadData(或类似的方法),这将清空视图(重置其滚动位置到顶部),然后重新填充它瞬间?

+0

哦......你说的没错!我将文本字段设置为“发送结束编辑”而不是“仅限发送”。因此,当我点击tableview时,它再次运行搜索。如果我在点击tableview之前选中“搜索”按钮,它按预期工作。 谢谢! – 2010-08-18 13:54:18

0

我曾经有一个类似的错误,原因是我的窗口控制器正在处理awakeFromNib,并设置列表中的滚动位置,以便它在第一次加载时位于正确的位置。但是,我最终意识到,它也正在从根据需要创建的基于nib的表视图单元中唤醒来自消息的消息,这在滚动时有时会意外地混淆了表滚动值。我的修复是在处理第一个awakeFromNib时使窗口控制器只设置滚动位置。