20

I've got an app that uses a Toolbar in a NSWindow. I don't want users to be able to customize this toolbar for aesthetic reasons. In Sierra there's a new Menu option that gets inserted into "Menu > View" called Show Tab Bar. How do I disable this? Enabling it only seems to increase the tool bar's height as I don't have extra labels showing under the icons.

strangetimes
  • 4,953
  • 1
  • 34
  • 62

6 Answers6

33

You can also do this on IB, on the Window’s attributes inspector

NSWindow attribute inspector

leonaka
  • 868
  • 1
  • 6
  • 12
17

On 10.12, you need to now set the following when the window is created as Tab Bar is now available by default:

[NSWindow setAllowsAutomaticWindowTabbing: NO];

The answer is the same in Swift and SwiftUI

func applicationWillFinishLaunching(_ notification: Notification) {
    NSWindow.allowsAutomaticWindowTabbing = false
}

Note that the call is made on the class NSWindow not on an instance of NSWindow

JuJoDi
  • 14,627
  • 23
  • 80
  • 126
strangetimes
  • 4,953
  • 1
  • 34
  • 62
  • 4
    On 10.15 this method no longer seems to exist. Instead you can set the `tabbingMode` of the window to `.disallowed`. Specifically adding `window.tabbingMode = .disallowed` to the `applicationDidFinishLaunching` method of the `NSApplicationDelegate` seems to work. – Steven W. Klassen Feb 14 '20 at 15:24
  • The above comment is not true, it seems like they may have been trying to call `allowsAutomaticWindowTabbing` on an instance of a window rather than on NSWindow the class. In swift and swiftui you can still call `NSWindow.allowsAutomaticWindowTabbing = false` to remove these items entirely in all app windows rather than disabling them for individual windows. – JuJoDi Jan 08 '21 at 19:11
5

To disable tabbing on individual windows call setTabbingMode:

if([window respondsToSelector:@selector(setTabbingMode:)]) {
    // this particular window doesn't support tabbing in Sierra.
    [window setTabbingMode:NSWindowTabbingModeDisallowed];
}
adib
  • 8,285
  • 6
  • 52
  • 91
4

If you don't want to compile against the latest frameworks, you can use the following code in your NSWindowsController sub classes:

Swift:

 override func awakeFromNib() {
     if NSAppKitVersionNumber > 1500 {
        self.window?.setValue(2, forKey: "tabbingMode")
     }
 }

Objective-C:

- (void)awakeFromNib {
    if (NSAppKitVersionNumber > 1500) {
        [self.window setValue:[NSNumber numberWithInt:2] forKey:@"tabbingMode"];
    }
}
Ely
  • 8,259
  • 1
  • 54
  • 67
4

Swift solution:

override func awakeFromNib() {
    super.awakeFromNib()
    if #available(OSX 10.12, *) {
        tabbingMode = .disallowed
    }
}
Matej Ukmar
  • 2,157
  • 22
  • 27
4

Swift 5

In your NSWindowController:

self.window?.tabbingMode = .disallowed
ixany
  • 5,433
  • 9
  • 41
  • 65