Cocoa 基于OS X版本的NSToolbarItem可用性

Cocoa 基于OS X版本的NSToolbarItem可用性,cocoa,macos,nstoolbar,nstoolbaritem,Cocoa,Macos,Nstoolbar,Nstoolbaritem,我有一个可以跨多个OS X版本使用的应用程序。让NSToolbarItem仅对某些OS版本的用户可用的最佳方法是什么。当它不可用时,它应该完全隐藏,而不仅仅是禁用 为了简化,如何以编程方式从此(下面)菜单中删除工具栏项目? 编辑:我试图覆盖委托中的工具栏AllowedItemIdentifiers:,如下所示: - (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar { NSLog(@"Toolbar reques

我有一个可以跨多个OS X版本使用的应用程序。让
NSToolbarItem
仅对某些OS版本的用户可用的最佳方法是什么。当它不可用时,它应该完全隐藏,而不仅仅是禁用

为了简化,如何以编程方式从此(下面)菜单中删除工具栏项目?

编辑:我试图覆盖委托中的
工具栏AllowedItemIdentifiers:
,如下所示:

- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar {
    NSLog(@"Toolbar requesting allowed items.");
    NSMutableArray *array = [NSMutableArray array];
    [array addObject:@"TPUpToolbarItem"];
    [array addObject:@"TPDownToolbarItem"];
    [array addObject:@"TPResetToolbarItem"];
    [array addObject:@"TPSpeedToolbarItem"];
    [array addObject:@"TPGroupToolbarItem"];
    [array addObject:@"TPBackgroundToolbarItem"];
    [array addObject:NSToolbarShowFontsItemIdentifier];
    if (floor(NSAppKitVersionNumber) <= 1038) {
        NSLog(@"Below Lion, adding Fullscreen item.");
        [array addObject:@"TPFSToolbarItem"];
    }
    [array addObject:@"TPFlipHToolbarItem"];
    [array addObject:@"TPFlipVToolbarItem"];
    [array addObject:NSToolbarFlexibleSpaceItemIdentifier];
    [array addObject:NSToolbarSpaceItemIdentifier];
    [array addObject:NSToolbarSeparatorItemIdentifier];
    [array addObject:NSToolbarShowColorsItemIdentifier];
    [array addObject:NSToolbarPrintItemIdentifier];
    return array;
}
-(NSArray*)工具栏AllowedItemIdentifiers:(NSToolbar*)工具栏{
NSLog(@“工具栏请求允许的项目”);
NSMutableArray*数组=[NSMutableArray];
[数组addObject:@“tpuptolbaritem”];
[array addObject:@“TPDownToolbarItem”];
[数组addObject:@“TPResetToolbarItem”];
[数组addObject:@“TPSpeedToolbarItem”];
[array addObject:@“TPGroupToolbarItem”];
[array addObject:@“TPBackgroundToolbarItem”];
[数组addObject:NSToolbarShowFontsItemIdentifier];

如果(floor(NSAppKitVersionNumber)使用。

除了
-toolbarAllowedItemIdentifiers:
之外,不要忘记
-toolbarDefaultItemIdentifiers:
。请尝试以下操作:

enum {
    MDUndeterminedVersion    = 0,
    MDTiger                  = 0x1040,
    MDLeopard                = 0x1050,
    MDSnowLeopard            = 0x1060,
    MDLion                   = 0x1070,
    MDMountainLion           = 0x1080,
    MDMavericks              = 0x1090,
    MDUnknownVersion         = 0x1100 // ??
};

static SInt32 MDSystemVersion = MDUndeterminedVersion;

+ (void)initialize {
    if (MDSystemVersion == MDUndeterminedVersion) {
        SInt32 MDFullSystemVersion = 0;
        Gestalt(gestaltSystemVersion, &MDFullSystemVersion);
        MDSystemVersion = MDFullSystemVersion & 0xfffffff0;
    }
}

- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar {
    NSLog(@"Toolbar requesting allowed items.");
    NSMutableArray *array = [NSMutableArray array];
    [array addObject:@"TPUpToolbarItem"];
    [array addObject:@"TPDownToolbarItem"];
    [array addObject:@"TPResetToolbarItem"];
    [array addObject:@"TPSpeedToolbarItem"];
    [array addObject:@"TPGroupToolbarItem"];
    [array addObject:@"TPBackgroundToolbarItem"];
    [array addObject:NSToolbarShowFontsItemIdentifier];
    if (MDSystemVersion < MDLion) {
        NSLog(@"Below Lion, adding Fullscreen item.");
        [array addObject:@"TPFSToolbarItem"];
    }
    [array addObject:@"TPFlipHToolbarItem"];
    [array addObject:@"TPFlipVToolbarItem"];
    [array addObject:NSToolbarFlexibleSpaceItemIdentifier];
    [array addObject:NSToolbarSpaceItemIdentifier];
    [array addObject:NSToolbarSeparatorItemIdentifier];
    [array addObject:NSToolbarShowColorsItemIdentifier];
    [array addObject:NSToolbarPrintItemIdentifier];
    return array;
}
enum{
MDUndeterminedVersion=0,
MDTiger=0x1040,
MDLeopard=0x1050,
MDSnowLeopard=0x1060,
MDLion=0x1070,
MDMountainLion=0x1080,
MDMavericks=0x1090,
MDUnknownVersion=0x1100/??
};
静态SInt32 MDSystemVersion=MDUndeminedVersion;
+(无效)初始化{
如果(MDSystemVersion==MDUndeterminedVersion){
SInt32 MDFullSystemVersion=0;
格式塔(格式塔系统版本和MDFullSystemVersion);
MDSystemVersion=MDFullSystemVersion&0xfffffff0;
}
}
-(NSArray*)工具栏AllowedItemIdentifiers:(NSToolbar*)工具栏{
NSLog(@“工具栏请求允许的项目”);
NSMutableArray*数组=[NSMutableArray];
[数组addObject:@“tpuptolbaritem”];
[array addObject:@“TPDownToolbarItem”];
[数组addObject:@“TPResetToolbarItem”];
[数组addObject:@“TPSpeedToolbarItem”];
[array addObject:@“TPGroupToolbarItem”];
[array addObject:@“TPBackgroundToolbarItem”];
[数组addObject:NSToolbarShowFontsItemIdentifier];
如果(MDSystemVersion
--

-(NSArray*)工具栏DefaultItemIdentifiers:(NSToolbar*)工具栏{
NSLog(@“工具栏请求默认项”);
NSMutableArray*数组=[NSMutableArray];
[数组addObject:@“tpuptolbaritem”];
[array addObject:@“TPDownToolbarItem”];
[数组addObject:@“TPResetToolbarItem”];
[数组addObject:@“TPSpeedToolbarItem”];
[array addObject:@“TPGroupToolbarItem”];
[array addObject:@“TPBackgroundToolbarItem”];
[数组addObject:NSToolbarShowFontsItemIdentifier];
如果(MDSystemVersion

请注意,如果您为工具栏设置了“允许用户自定义”,则可能需要删除apps pref文件以注意工具栏设置的更改。

@NSGod就快到了。虽然他的其余代码正常工作,但IB似乎正在覆盖我的代码并添加全屏按钮。我必须将工具栏项目移出工具栏并重新设置然后通过添加以下方法手动将
NSToolbarDelegate
指向它:(
up
down
,等等是
IBOutlet
s)


与OS X版本相比,检查功能可用性是一个更好的主意。您正在使用的哪些功能在其他版本中不可用?但真正重要的是隐藏或显示
NSToolbarItem
。为什么您需要自己的工具栏项来全屏显示?已经有一个按钮。我需要在Lion and s中删除该按钮tay在雪豹和更低版本中。@SpudAffle:只需使用NSToolbar方法更改显示的项目。这些方法会删除可见项目,但不会删除自定义菜单中的项目。如何删除这些项目?只需根据系统版本更改
toolbarAllowedItemIdentifiers:
的结果即可。
- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar {
    NSLog(@"Toolbar requesting default items.");
    NSMutableArray *array = [NSMutableArray array];
    [array addObject:@"TPUpToolbarItem"];
    [array addObject:@"TPDownToolbarItem"];
    [array addObject:@"TPResetToolbarItem"];
    [array addObject:@"TPSpeedToolbarItem"];
    [array addObject:@"TPGroupToolbarItem"];
    [array addObject:@"TPBackgroundToolbarItem"];
    [array addObject:NSToolbarShowFontsItemIdentifier];
    if (MDSystemVersion < MDLion) {
        NSLog(@"Below Lion, adding Fullscreen item.");
        [array addObject:@"TPFSToolbarItem"];
    }
    [array addObject:@"TPFlipHToolbarItem"];
    [array addObject:@"TPFlipVToolbarItem"];
    [array addObject:NSToolbarFlexibleSpaceItemIdentifier];
    [array addObject:NSToolbarSpaceItemIdentifier];
    [array addObject:NSToolbarSeparatorItemIdentifier];
    [array addObject:NSToolbarShowColorsItemIdentifier];
    [array addObject:NSToolbarPrintItemIdentifier];
    return array;
}
- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag {
    if ([itemIdentifier isEqualToString:@"TPUpToolbarItem"]) {
        return up;
    }
    if ([itemIdentifier isEqualToString:@"TPDownToolbarItem"]) {
        return down;
    }

    if ([itemIdentifier isEqualToString:@"TPResetToolbarItem"]) {
        return reset;
    }
    if ([itemIdentifier isEqualToString:NSToolbarShowColorsItemIdentifier]) {
        return colors;
    }
    if ([itemIdentifier isEqualToString:NSToolbarShowFontsItemIdentifier]) {
        return fonts;
    }
    if ([itemIdentifier isEqualToString:NSToolbarPrintItemIdentifier]) {
        return print;
    }
    if ([itemIdentifier isEqualToString:@"TPSpeedToolbarItem"]) {
        return speed;
    }
    if ([itemIdentifier isEqualToString:@"TPBackgroundToolbarItem"]) {
        return background;
    }
    if ([itemIdentifier isEqualToString:@"TPGroupToolbarItem"]) {
        return group;
    }
    if ([itemIdentifier isEqualToString:NSToolbarFlexibleSpaceItemIdentifier]) {
        return flex;
    }
    if ([itemIdentifier isEqualToString:NSToolbarSpaceItemIdentifier]) {
        return space;
    }
    if ([itemIdentifier isEqualToString:@"TPFlipHToolbarItem"]) {
        return flipH;
    }
    if ([itemIdentifier isEqualToString:@"TPFlipVToolbarItem"]) {
        return flipV;
    }
    if ([itemIdentifier isEqualToString:NSToolbarSeparatorItemIdentifier]) {
        return sep;
    }
    if ([itemIdentifier isEqualToString:@"TPFSToolbarItem"]) {
        return fsItem;
    }
}