NSTableView跳过选择......为什么?

时间:2010-08-18 13:31:46

标签: cocoa nstableview

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

我只实现了DataSource协议的这两种方法:

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

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

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

有什么见解?我正在运行Snow Leopard,但我相信它也发生在我运行Leopard时。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我有一次类似的错误,原因是我的窗口控制器正在处理awakeFromNib并且正在设置列表上的滚动位置,以便在首次加载时它处于正确的位置。但是,我最终意识到它还从根据需要创建的基于nib的表视图单元格获取awakeFromNib消息,这有时会在滚动时意外地弄乱表滚动值。我的修复是让窗口控制器在处理第一个awakeFromNib时只设置滚动位置。