1

I'm trying to make a simple NSTouchBar with 3 levels of NSPopoverTouchBarItem, so basically its like this:

touchbar I have the main NSTouchbar with 3 NSButton and 1 NSPopoverTouchBarItem which open the second NSTouchbar

The second NSTouchbar with 2 NSButton and 1 NSPopoverTouchBarItem which open the third NSTouchbar

The problem is when i try open the 3rd NSTouchbar, seems like the 2nd NSTouchbar is dismissed, and sometimes doesn't open the 3rd.

Also when opens the third one, when we close, we go to 1st NSTouchbar, not the 2nd NSTouchbar

Here is the code, should be simple, and should work (i'm using Xcode TouchBar Simulator)

#import "Window.h"

static NSTouchBarCustomizationIdentifier TouchBarCustomizationIdentifier    = @"TouchBarCustomizationIdentifier";

static NSTouchBarItemIdentifier NSTouchBarItemIdentifier1                   = @"NSTouchBarItemIdentifier1";
static NSTouchBarItemIdentifier NSTouchBarItemIdentifier2                   = @"NSTouchBarItemIdentifier2";
static NSTouchBarItemIdentifier NSTouchBarItemIdentifier3                   = @"NSTouchBarItemIdentifier3";
static NSTouchBarItemIdentifier NSTouchBarItemIdentifier4                   = @"NSTouchBarItemIdentifier4";

static NSTouchBarItemIdentifier NSTouchBarItemIdentifier4_1                 = @"NSTouchBarItemIdentifier4_1";
static NSTouchBarItemIdentifier NSTouchBarItemIdentifier4_2                 = @"NSTouchBarItemIdentifier4_2";
static NSTouchBarItemIdentifier NSTouchBarItemIdentifier4_3                 = @"NSTouchBarItemIdentifier4_3";

static NSTouchBarItemIdentifier NSTouchBarItemIdentifier4_3_1               = @"NSTouchBarItemIdentifier4_3_1";
static NSTouchBarItemIdentifier NSTouchBarItemIdentifier4_3_2               = @"NSTouchBarItemIdentifier4_3_2";

@implementation Window

- (NSTouchBar*) makeTouchBar {

    _touchBar1 = [[NSTouchBar alloc] init];
    [_touchBar1 setDelegate:self];
    [_touchBar1 setCustomizationIdentifier:TouchBarCustomizationIdentifier];

    [_touchBar1 setDefaultItemIdentifiers:@[
                                            NSTouchBarItemIdentifier1,
                                            NSTouchBarItemIdentifier2,
                                            NSTouchBarItemIdentifier3,
                                            NSTouchBarItemIdentifier4,
                                            ]
     ];
    [_touchBar1 setCustomizationRequiredItemIdentifiers:@[
                                                          NSTouchBarItemIdentifier1,
                                                          NSTouchBarItemIdentifier2,
                                                          NSTouchBarItemIdentifier3,
                                                          NSTouchBarItemIdentifier4,
                                                          ]
     ];

    return _touchBar1;
}

- (nullable NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier {

    if ([identifier isEqual:NSTouchBarItemIdentifier1]) {

        NSCustomTouchBarItem *customTouchBarItem = [[NSCustomTouchBarItem alloc] initWithIdentifier:identifier];
        [customTouchBarItem setView:[NSButton buttonWithTitle:@"IS TOUCH 1" target:self action:nil]];

        return customTouchBarItem;

    } else if ([identifier isEqual:NSTouchBarItemIdentifier2]) {

        NSCustomTouchBarItem *customTouchBarItem = [[NSCustomTouchBarItem alloc] initWithIdentifier:identifier];

        [customTouchBarItem setView:[NSButton buttonWithTitle:@"IS TOUCH1" target:self action:nil]];

        return customTouchBarItem;

    } else if ([identifier isEqual:NSTouchBarItemIdentifier3]) {

        NSCustomTouchBarItem *customTouchBarItem = [[NSCustomTouchBarItem alloc] initWithIdentifier:identifier];

        [customTouchBarItem setView:[NSButton buttonWithTitle:@"IS TOUCH1" target:self action:nil]];

        return customTouchBarItem;

    } else if ([identifier isEqual:NSTouchBarItemIdentifier4]) {

        NSPopoverTouchBarItem *customTouchBarItem = [[NSPopoverTouchBarItem alloc] initWithIdentifier:identifier];
        [customTouchBarItem setCollapsedRepresentationLabel:@"OPEN TOUCH 2"];

        _touchBar2 = [[NSTouchBar alloc] init];
        [_touchBar2 setDelegate:self];
        [_touchBar2 setCustomizationIdentifier:TouchBarCustomizationIdentifier];

        [_touchBar2 setDefaultItemIdentifiers:@[
                                                NSTouchBarItemIdentifier4_1,
                                                NSTouchBarItemIdentifier4_2,
                                                NSTouchBarItemIdentifier4_3,
                                                ]
         ];
        [_touchBar2 setCustomizationRequiredItemIdentifiers:@[
                                                              NSTouchBarItemIdentifier4_1,
                                                              NSTouchBarItemIdentifier4_2,
                                                              NSTouchBarItemIdentifier4_3,
                                                              ]
         ];

        [customTouchBarItem setPopoverTouchBar:_touchBar2];

        return customTouchBarItem;

    } else if ([identifier isEqual:NSTouchBarItemIdentifier4_1]) {

        NSCustomTouchBarItem *customTouchBarItem = [[NSCustomTouchBarItem alloc] initWithIdentifier:identifier];

        [customTouchBarItem setView:[NSButton buttonWithTitle:@"IS TOUCH 2" target:self action:nil]];

        return customTouchBarItem;

    } else if ([identifier isEqual:NSTouchBarItemIdentifier4_2]) {

        NSCustomTouchBarItem *customTouchBarItem = [[NSCustomTouchBarItem alloc] initWithIdentifier:identifier];

        [customTouchBarItem setView:[NSButton buttonWithTitle:@"IS TOUCH 2" target:self action:nil]];

        return customTouchBarItem;

    } else if ([identifier isEqual:NSTouchBarItemIdentifier4_3]) {

        NSPopoverTouchBarItem *customTouchBarItem = [[NSPopoverTouchBarItem alloc] initWithIdentifier:identifier];
        [customTouchBarItem setCollapsedRepresentationLabel:@"OPEN TOUCH 3"];

        _touchBar3 = [[NSTouchBar alloc] init];
        [_touchBar3 setDelegate:self];
        [_touchBar3 setCustomizationIdentifier:TouchBarCustomizationIdentifier];

        [_touchBar3 setDefaultItemIdentifiers:@[
                                                NSTouchBarItemIdentifier4_3_1,
                                                NSTouchBarItemIdentifier4_3_2,
                                                ]
         ];
        [_touchBar3 setCustomizationRequiredItemIdentifiers:@[
                                                              NSTouchBarItemIdentifier4_3_1,
                                                              NSTouchBarItemIdentifier4_3_2,
                                                              ]
         ];

        [customTouchBarItem setPopoverTouchBar:_touchBar3];


        return customTouchBarItem;

    } else if ([identifier isEqual:NSTouchBarItemIdentifier4_3_1]) {

        NSCustomTouchBarItem *customTouchBarItem = [[NSCustomTouchBarItem alloc] initWithIdentifier:identifier];

        [customTouchBarItem setView:[NSButton buttonWithTitle:@"IS TOUCH 3" target:self action:nil]];

        return customTouchBarItem;

    } else if ([identifier isEqual:NSTouchBarItemIdentifier4_3_2]) {

        NSCustomTouchBarItem *customTouchBarItem = [[NSCustomTouchBarItem alloc] initWithIdentifier:identifier];

        [customTouchBarItem setView:[NSButton buttonWithTitle:@"IS TOUCH 3" target:self action:nil]];

        return customTouchBarItem;

    }

    return nil;
}

@end
ruiaureliano
  • 1,552
  • 1
  • 14
  • 13
  • This looks like a bug in Apple's SDK. Another reason is that I can't find any system touch bars with two levels of popovers like you are trying to implement. What I suggest is using a Scrubber like in Apple's [NSTouchBar Catalog](https://developer.apple.com/library/content/samplecode/NSTouchBarCatalog/Introduction/Intro.html#//apple_ref/doc/uid/TP40017550) to fit more items into only two levels of popovers (at least until they fix it). – Bruno Philipe Jan 12 '17 at 02:20

1 Answers1

0

Apple says popovers cannot have popovers, so you can only have a bar and a popover, not a popover inside a popover.

This is what they have posted in their forum to answer a similar question:

enter image description here

https://forums.developer.apple.com/thread/78730

Duck
  • 34,902
  • 47
  • 248
  • 470