How can I stop NSTableView from saving the current scroll position?

cocoa, macos, nstableview

Solution

The scroll position is stored by `NSScrollView`, which implements `encodeRestorableStateWithCoder:`/`restoreStateWithCoder:` since OS X Lion. (Interface Builder automatically wraps a table view in a `NSScrollView`→`NSClipView`→`NSTableView` hierarchy).

To get a scroll view that is scrolled to top after an app relaunch you have several options:

- Turn off view state restoration for the entire window in Interface Builder:

- Subclass `NSScrollView` and override `encodeRestorableStateWithCoder:` with an empty implementation (Don't forget to set it as class for your your table view instance in IB):

Programmatically scroll to top after app relaunch:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [[self.scrollView contentView] scrollToPoint:NSMakePoint(0.0, 0.0)];
    [self.scrollView reflectScrolledClipView:[self.scrollView contentView]];
}

Personally I'd go with method 3, because turning off state restoration for the whole window might break some behaviour that your users expect and method 2 is against Apple's recommendation on calling `[super encodeRestorableStateWithCoder:]` when subclassing `NSView`.

Problem

In my app I have a `NSTableView` in `NSViewController` with a `NSArrayController` provide the content. It works great, however, when I scroll to some position of tableview, quit app and re-launch it, It will restore the last scroll position. I don't like this behavior, I want it to keep at the top. I tried to `setAutosaveTableColumns` to NO on NSTableView, it seems not the option I need. It still works the old way. Does is any option to turn this off?

Original source