首页 > 其他分享 >Mac开发基础24-NSToolbar

Mac开发基础24-NSToolbar

时间:2024-08-06 18:17:11浏览次数:6  
标签:24 工具栏 NSToolbarItem self item Mac NSToolbar toolbar

NSToolbar 是 macOS 应用中的一个重要控件,用于创建窗口顶部的工具栏。工具栏通常包含按钮和其他控件,用户可以通过这些控件快速访问常用功能。NSToolbarNSToolbarItem 协同工作,NSToolbar 是工具栏容器,而 NSToolbarItem 是工具栏项。下面我们详细介绍 NSToolbar 的常见 API 和基础技巧。

基本使用

创建和初始化工具栏

Objective-C

#import <Cocoa/Cocoa.h>

// 创建一个 NSToolbar 实例
NSToolbar *toolbar = [[NSToolbar alloc] initWithIdentifier:@"MainToolbar"];

// 设置 Delegate
[toolbar setDelegate:self];

// 将工具栏添加到窗口
[self.window setToolbar:toolbar];

Swift

import Cocoa

// 创建一个 NSToolbar 实例
let toolbar = NSToolbar(identifier: "MainToolbar")

// 设置 Delegate
toolbar.delegate = self

// 将工具栏添加到窗口
self.window?.toolbar = toolbar

创建工具栏项

Objective-C

// 实现 NSToolbarDelegate 方法,返回所有允许在工具栏中使用的项
- (NSArray<NSString *> *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar {
    return @[@"FirstItem", NSToolbarFlexibleSpaceItemIdentifier, @"SecondItem"];
}

// 实现 NSToolbarDelegate 方法,为特定标识符创建相应的工具栏项
- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag {
    if ([itemIdentifier isEqualToString:@"FirstItem"]) {
        NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:@"FirstItem"];
        item.label = @"First";
        item.toolTip = @"First Tool";
        item.action = @selector(handleToolbarAction:);
        item.target = self;
        item.image = [NSImage imageNamed:NSImageNameAddTemplate];
        return item;
    } else if ([itemIdentifier isEqualToString:@"SecondItem"]) {
        NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:@"SecondItem"];
        item.label = @"Second";
        item.toolTip = @"Second Tool";
        item.action = @selector(handleToolbarAction:);
        item.target = self;
        item.image = [NSImage imageNamed:NSImageNameRemoveTemplate];
        return item;
    }
    return nil;
}

Swift

// 实现 NSToolbarDelegate 方法,返回所有允许在工具栏中使用的项
func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
    return [.init("FirstItem"), .flexibleSpace, .init("SecondItem")]
}

// 实现 NSToolbarDelegate 方法,为特定标识符创建相应的工具栏项
func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {
    if itemIdentifier.rawValue == "FirstItem" {
        let item = NSToolbarItem(itemIdentifier: .init("FirstItem"))
        item.label = "First"
        item.toolTip = "First Tool"
        item.action = #selector(handleToolbarAction(_:))
        item.target = self
        item.image = NSImage(named: NSImage.addTemplateName)
        return item
    } else if itemIdentifier.rawValue == "SecondItem" {
        let item = NSToolbarItem(itemIdentifier: .init("SecondItem"))
        item.label = "Second"
        item.toolTip = "Second Tool"
        item.action = #selector(handleToolbarAction(_:))
        item.target = self
        item.image = NSImage(named: NSImage.removeTemplateName)
        return item
    }
    return nil
}

响应工具栏项点击事件

Objective-C

// 实现工具栏项的点击响应方法
- (void)handleToolbarAction:(id)sender {
    NSToolbarItem *selectedItem = (NSToolbarItem *)sender;
    NSLog(@"Selected item: %@", selectedItem.itemIdentifier);
}

Swift

// 实现工具栏项的点击响应方法
@objc func handleToolbarAction(_ sender: Any?) {
    if let toolbarItem = sender as? NSToolbarItem {
        print("Selected item: \(toolbarItem.itemIdentifier.rawValue)")
    }
}

自定义工具栏项

可以通过子类化 NSToolbarItem 来创建自定义工具栏项。

Objective-C

@interface CustomToolbarItem : NSToolbarItem
@end

@implementation CustomToolbarItem

- (instancetype)initWithItemIdentifier:(NSString *)itemIdentifier {
    self = [super initWithItemIdentifier:itemIdentifier];
    if (self) {
        // 自定义设置
        self.label = @"Custom";
        self.toolTip = @"Custom Tool";
        self.image = [NSImage imageNamed:NSImageNameInfo];
    }
    return self;
}

@end

Swift

class CustomToolbarItem: NSToolbarItem {
    override init(itemIdentifier: NSToolbarItem.Identifier) {
        super.init(itemIdentifier: itemIdentifier)
        // 自定义设置
        self.label = "Custom"
        self.toolTip = "Custom Tool"
        self.image = NSImage(named: NSImage.infoTemplateName)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

动态更新工具栏项

可以通过设置工具栏项的 minSizemaxSize 以及使用 validateToolbarItem 方法来动态更新工具栏项。

Objective-C

- (BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem {
    if ([toolbarItem.itemIdentifier isEqualToString:@"FirstItem"]) {
        // 根据条件禁用或启用工具栏项
        return YES;
    }
    return YES;
}

// 更新工具栏项的大小
- (void)updateToolbarItemsSize {
    NSToolbarItem *firstItem = [self.toolbar.items firstObject];
    [firstItem setMinSize:NSMakeSize(30, 30)];
    [firstItem setMaxSize:NSMakeSize(50, 50)];
}

Swift

func validateToolbarItem(_ item: NSToolbarItem) -> Bool {
    if item.itemIdentifier.rawValue == "FirstItem" {
        // 根据条件禁用或启用工具栏项
        return true
    }
    return true
}

// 更新工具栏项的大小
func updateToolbarItemsSize() {
    if let firstItem = toolbar.items.first {
        firstItem.minSize = NSSize(width: 30, height: 30)
        firstItem.maxSize = NSSize(width: 50, height: 50)
    }
}

隐藏和显示工具栏

可以通过 setVisible: 方法控制工具栏的显示和隐藏。

Objective-C

// 隐藏工具栏
[self.window.toolbar setVisible:NO];
// 显示工具栏
[self.window.toolbar setVisible:YES];

Swift

// 隐藏工具栏
self.window?.toolbar?.isVisible = false
// 显示工具栏
self.window?.toolbar?.isVisible = true

高级用法

自定义工具栏项视图

可以自定义工具栏项的视图,比如将 NSButton 作为工具栏项。

Objective-C

- (NSToolbarItem *)createCustomViewToolbarItemWithIdentifier:(NSString *)identifier label:(NSString *)label action:(SEL)action {
    NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:identifier];
    item.label = label;
    item.view = [[NSButton alloc] initWithFrame:NSMakeRect(0, 0, 100, 30)];
    NSButton *button = (NSButton *)item.view;
    [button setTitle:label];
    [button setTarget:self];
    [button setAction:action];
    return item;
}

Swift

func createCustomViewToolbarItem(identifier: NSToolbarItem.Identifier, label: String, action: Selector) -> NSToolbarItem {
    let item = NSToolbarItem(itemIdentifier: identifier)
    item.label = label
    let button = NSButton(frame: NSRect(x: 0, y: 0, width: 100, height: 30))
    button.title = label
    button.target = self
    button.action = action
    item.view = button
    return item
}

动态添加和移除工具栏项

Objective-C

// 动态添加工具栏项
- (void)addToolbarItemWithIdentifier:(NSString *)identifier {
    NSToolbarItem *newItem = [self toolbar:nil itemForItemIdentifier:identifier willBeInsertedIntoToolbar:YES];
    [self.toolbar insertItemWithItemIdentifier:identifier atIndex:self.toolbar.items.count];
}

// 动态移除工具栏项
- (void)removeToolbarItemWithIdentifier:(NSString *)identifier {
    for (NSToolbarItem *item in self.toolbar.items) {
        if ([item.itemIdentifier isEqualToString:identifier]) {
            [self.toolbar removeItemAtIndex:[self.toolbar.items indexOfObject:item]];
            break;
        }
    }
}

Swift

// 动态添加工具栏项
func addToolbarItem(identifier: NSToolbarItem.Identifier) {
    if let newItem = self.toolbar(nil, itemForItemIdentifier: identifier, willBeInsertedIntoToolbar: true) {
        toolbar.insertItem(withItemIdentifier: identifier, at: toolbar.items.count)
    }
}

// 动态移除工具栏项
func removeToolbarItem(identifier: NSToolbarItem.Identifier) {
    for (item in toolbar.items) {
        if item.itemIdentifier == identifier {
            if let index = toolbar.items.firstIndex(of: item) {
                toolbar.removeItem(at: index)
                break
            }
        }
    }
}

工具栏定制面板

macOS 提供了工具栏定制功能,用户可以通过它自行选择工具栏中的项。

Objective-C

// 允许工具栏定制
[toolbar setAllowsUserCustomization:YES];

// 实现代理方法,返回用户定制时可以看到的项
- (NSArray<NSString *> *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar {
    return @[@"FirstItem", NSToolbarFlexibleSpaceItemIdentifier, @"SecondItem"];
}

- (NSArray<NSString *> *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar {
    return @[@"FirstItem", NSToolbarFlexibleSpaceItemIdentifier, @"SecondItem", @"CustomItem"];
}

Swift

// 允许工具栏定制
toolbar.allowsUserCustomization = true

// 实现代理方法,返回用户定制时可以看到的项
func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
    return [.init("FirstItem"), .flexibleSpace, .init("SecondItem")]
}

func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
    return [.init("FirstItem"), .flexibleSpace, .init("SecondItem"), .init("CustomItem")]
}

封装工具类

为了更方便地使用 NSToolbar,可以封装一个工具类,提供常见功能的高层接口。

Objective-C

#import <Cocoa/Cocoa.h>

@interface NSToolbarHelper : NSObject

+ (NSToolbar *)createToolbarWithIdentifier:(NSString *)identifier delegate:(id<NSToolbarDelegate>)delegate;
+ (NSToolbarItem *)createToolbarItemWithIdentifier:(NSString *)identifier label:(NSString *)label action:(SEL)action target:(id)target image:(NSImage *)image;

@end

@implementation NSToolbarHelper

+ (NSToolbar *)createToolbarWithIdentifier:(NSString *)identifier delegate:(id<NSToolbarDelegate>)delegate {
    NSToolbar *toolbar = [[NSToolbar alloc] initWithIdentifier:identifier];
    [toolbar setDelegate:delegate];
    [toolbar setAllowsUserCustomization:YES];
    return toolbar;
}

+ (NSToolbarItem *)createToolbarItemWithIdentifier:(NSString *)identifier label:(NSString *)label action:(SEL)action target:(id)target image:(NSImage *)image {
    NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:identifier];
    item.label = label;
    item.toolTip = label;
    item.image = image;
    item.action = action;
    item.target = target;
    return item;
}

@end

Swift

import Cocoa

class NSToolbarHelper {
    
    // 创建 NSToolbar 并设置代理
    static func createToolbar(identifier: String, delegate: NSToolbarDelegate) -> NSToolbar {
        let toolbar = NSToolbar(identifier: NSToolbar.Identifier(identifier))
        toolbar.delegate = delegate
        toolbar.allowsUserCustomization = true
        return toolbar
    }
    
    // 创建 NSToolbarItem
    static func createToolbarItem(identifier: String, label: String, action: Selector, target: AnyObject, image: NSImage) -> NSToolbarItem {
        let item = NSToolbarItem(itemIdentifier: NSToolbarItem.Identifier(identifier))
        item.label = label
        item.toolTip = label
        item.image = image
        item.action = action
        item.target = target
        return item
    }
}

使用示例

Objective-C

// 创建 NSToolbar
NSToolbar *toolbar = [NSToolbarHelper createToolbarWithIdentifier:@"MainToolbar" delegate:self];
[self.window setToolbar:toolbar];

// 创建并添加工具栏项
NSToolbarItem *firstItem = [NSToolbarHelper createToolbarItemWithIdentifier:@"FirstItem" label:@"First" action:@selector(handleToolbarAction:) target:self image:[NSImage imageNamed:NSImageNameAddTemplate]];
[toolbar insertItemWithItemIdentifier:@"FirstItem" atIndex:0];

NSToolbarItem *secondItem = [NSToolbarHelper createToolbarItemWithIdentifier:@"SecondItem" label:@"Second" action:@selector(handleToolbarAction:) target:self image:[NSImage imageNamed:NSImageNameRemoveTemplate]];
[toolbar insertItemWithItemIdentifier:@"SecondItem" atIndex:1];

Swift

// 创建 NSToolbar
let toolbar = NSToolbarHelper.createToolbar(identifier: "MainToolbar", delegate: self)
self.window?.toolbar = toolbar

// 创建并添加工具栏项
let firstItem = NSToolbarHelper.createToolbarItem(identifier: "FirstItem", label: "First", action: #selector(handleToolbarAction(_:)), target: self, image: NSImage(named: NSImage.addTemplateName)!)
toolbar.insertItem(withItemIdentifier: NSToolbarItem.Identifier("FirstItem"), at: 0)

let secondItem = NSToolbarHelper.createToolbarItem(identifier: "SecondItem", label: "Second", action: #selector(handleToolbarAction(_:)), target: self, image: NSImage(named: NSImage.removeTemplateName)!)
toolbar.insertItem(withItemIdentifier: NSToolbarItem.Identifier("SecondItem"), at: 1)

总结

通过了解 NSToolbar 的基本使用、创建工具栏项、响应工具栏项选择、自定义工具栏项、动态更新工具栏项、隐藏和显示工具栏以及工具栏定制面板等高级用法,并封装工具类,你将能够更高效地使用 NSToolbar 创建复杂的工具栏系统。在实际应用中,合理使用这些技巧可以显著提升用户界面的灵活性和用户体验。希望本文对你有所帮助,

标签:24,工具栏,NSToolbarItem,self,item,Mac,NSToolbar,toolbar
From: https://www.cnblogs.com/chglog/p/18345767

相关文章

  • Mac开发基础25-NSAlert
    NSAlert是macOS应用中的一个重要控件,用于显示警告与通知对话框。NSAlert允许开发者创建和配置弹出窗口,用于通知用户、确认操作或显示错误信息。基本使用创建和显示简单的警告框Objective-C#import<Cocoa/Cocoa.h>//实例化NSAlertNSAlert*alert=[[NSAlertalloc]......
  • Mac开发基础22-NSTabView
    NSTabView是macOS应用中的一个重要控件,用于创建带有多个选项卡的界面,类似于网页浏览器的选项卡功能。它能够将多个视图容器合并到一个控件中,每个视图容器都可以通过选项卡来切换。基本使用创建和初始化Objective-C#import<Cocoa/Cocoa.h>//创建一个NSTabView实例NST......
  • Mac开发基础23-NSMenu
    NSMenu是macOS应用中的一个重要控件,用于创建应用程序的菜单。这些菜单通常出现在屏幕顶部的菜单栏中,但也可以作为上下文菜单出现。NSMenu和NSMenuItem协同工作,NSMenu是菜单容器,而NSMenuItem是菜单项。本指南将详细介绍NSMenu的常见API和基础技巧。基本使用创建和初......
  • 2024.7.27模拟赛9
    模拟赛炸裂场,交互+提答T1ラーメンの食べ比べ交互题,没做过。。。\(N\le400\),有\(600\)次询问,其实还挺水的。先考虑二分,两两一组比较,会得到\(200\)个较大的和\(200\)个较小的,还剩\(400\)次查询。既然还剩\(400\)次查询,那也不用考虑二分了,直接\(200\)个暴力比......
  • Mac开发基础21-NSSplitView
    NSSplitView是macOS应用中的一个重要控件,允许用户调整窗口中的各个子视图大小。它通常用于创建可调整大小的面板布局,例如侧边栏和主内容区域。在本指南中,我们将详细介绍NSSplitView的常见API和基础技巧,并深入探讨相关知识。基本使用创建和初始化Objective-C#import<Co......
  • Mac开发基础20-NSCollectionView
    NSCollectionView是macOS开发中的一种强大控件,类似于iOS上的UICollectionView,用于展示和管理网格、列表等多种布局的数据展示视图。1.基本使用创建和初始化Objective-C#import<Cocoa/Cocoa.h>//创建并初始化一个NSCollectionView实例NSCollectionView*collecti......
  • HDU-ACM 2024 Day1
    T1009数位的关系(HDU7441)考虑\(l=r\)的情况,此时只要计算一个数字,我们将其展开为一个字符串\(S\)。设\(f_{i,j,k}\)表示考虑了\(S\)的前\(i\)位,选出了\(j\)个数字加入子序列,最后一个加入子序列的数字是\(k\)的方案数,转移平凡。拓展到\(l\neqr\),经典地将答......
  • Mac开发基础19-NSTableView(二)
    进阶使用和技巧1.单击和双击行事件处理Objective-C//单击行时的处理-(void)tableView:(NSTableView*)tableViewdidClickTableColumn:(NSTableColumn*)tableColumn{NSIntegerclickedRow=[tableViewclickedRow];if(clickedRow>=0){NSLog(@"Si......
  • 力扣每日一题2024.8.5
    600.不含连续1的非负整数(困难)给定一个正整数n,请你统计在[0,n]范围的非负整数中,有多少个整数的二进制表示中不存在连续的1。示例1:输入:n=5输出:5解释:下面列出范围在[0,5]的非负整数与其对应的二进制表示:0:01:12:103:114:1005:101......
  • (连续四届EI检索|稳定ACM出版、EI检索|线上线下结合)2024年第五届医学人工智能国际学术
    第五届医学人工智能国际学术会议(ISAIMS2024)将于2024年8月13-17日于荷兰阿姆斯特丹自由大学召开,国内分会场将于2024年10月25-27日于中国武汉召开。会议自2020年至今已经成功举办四届,吸引了来自海内外相关领域学者600余名。本届会议将继续围绕人工智能在医学领域的最新研究成果,为......