我有一个带有单个列的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时。
答案 0 :(得分:2)
当搜索NSTextField
失去焦点时,它会以某种方式触发表视图上的reloadData
(或类似方法),这会清空视图(将其滚动位置重置为顶部)然后立即重新填充它?
答案 1 :(得分:0)
我有一次类似的错误,原因是我的窗口控制器正在处理awakeFromNib并且正在设置列表上的滚动位置,以便在首次加载时它处于正确的位置。但是,我最终意识到它还从根据需要创建的基于nib的表视图单元格获取awakeFromNib消息,这有时会在滚动时意外地弄乱表滚动值。我的修复是让窗口控制器在处理第一个awakeFromNib时只设置滚动位置。