NSTableView. How to override autoscroll behavior?
I've got an NSTableView that displays (via bindings) data from an NSTreeController. The application frequently appends/changes data to/in the bound array.
The problem is that if the user has selected a row in the table, but has scrolled so that the selected data is no longer visible, when the开发者_C百科 application updates the array it causes the display to auto-scroll so that the selected line is once again on screen. This is pretty frustrating to users, especially since new data can arrive at any time.
Is there any way of disabling this feature?
You may have to subclass NSTableView
and override -scrollRowToVisible:
, temporarily bracketing the call to super
. This may also require a custom BOOL ivar in your subclass to keep track of whether you want to scroll.
I would start by setting a breakpoint there to see when exactly the autoscroll is triggered. This should help to find the proper moments to toggle the ivar.
Are you using an NSTreeController
with an NSOutlineView
or an NSArrayController
with an NSTableView
? Using an NSTreeController
with an NSTableView
doesn't make a lot of sense to me?
If you're using an NSTableView
you should probably be using an NSArrayController
to manage its data and this rearranging of the rows is a feature of the NSArrayController
. Try turning off the Auto Rearrange Content option on your controller within IB.
When it's on, the array controller will rearrange its objects on addition, removal and changes to objects that would affect the sort ordering (if any) and cause any table views or outline views to reload their data.
I don't know of a similar feature for NSTreeController
mainly because I don't use it since it's never worked well for me. I, sadly, recommend to just use the datasource methods for the NSOutlineView
and supply your data the old-fashioned way. In my experience, NSTreeController
is only well suited for the most trivial tasks.
精彩评论