面试题答案
一键面试- 动态添加或移除工具栏项目的代码示例:
- 首先,在视图控制器的头文件(假设为
ViewController.h
)中声明一个属性来存储工具栏:
#import <Cocoa/Cocoa.h> @interface ViewController : NSViewController @property (nonatomic, strong) NSToolbar *toolbar; @end
- 在视图控制器的实现文件(
ViewController.m
)中,初始化工具栏并设置其代理:
#import "ViewController.h" @interface ViewController () <NSToolbarDelegate> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.toolbar = [[NSToolbar alloc] initWithIdentifier:@"MyToolbar"]; self.toolbar.delegate = self; self.toolbar.displayMode = NSToolbarDisplayModeIconAndLabel; self.view.window.toolbar = self.toolbar; } - (NSArray<NSToolbarItem *> *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag { if ([itemIdentifier isEqualToString:@"item1"]) { NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:@"item1"]; item.label = @"Item 1"; item.image = [NSImage imageNamed:NSImageNameAddTemplate]; item.target = self; item.action = @selector(handleItem1Action:); return item; } return nil; } - (NSArray<NSString *> *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar { return @[@"item1"]; } - (NSArray<NSString *> *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar { return @[@"item1"]; } - (void)addToolbarItem { NSMutableArray *currentItems = [NSMutableArray arrayWithArray:self.toolbar.items]; NSToolbarItem *newItem = [[NSToolbarItem alloc] initWithItemIdentifier:@"newItem"]; newItem.label = @"New Item"; newItem.image = [NSImage imageNamed:NSImageNameRemoveTemplate]; newItem.target = self; newItem.action = @selector(handleNewItemAction:); [currentItems addObject:newItem]; self.toolbar.items = currentItems; } - (void)removeToolbarItem { NSMutableArray *currentItems = [NSMutableArray arrayWithArray:self.toolbar.items]; NSToolbarItem *itemToRemove = nil; for (NSToolbarItem *item in currentItems) { if ([item.itemIdentifier isEqualToString:@"newItem"]) { itemToRemove = item; break; } } if (itemToRemove) { [currentItems removeObject:itemToRemove]; self.toolbar.items = currentItems; } } - (void)handleItem1Action:(id)sender { NSLog(@"Item 1 action"); [self addToolbarItem]; } - (void)handleNewItemAction:(id)sender { NSLog(@"New Item action"); [self removeToolbarItem]; } @end
- 首先,在视图控制器的头文件(假设为
- 处理不同状态下工具栏项目的布局和交互逻辑:
- 布局:
- Mac OS 工具栏有其默认的布局方式。当添加或移除项目时,工具栏会自动重新排列项目。
NSToolbar
的displayMode
属性(如NSToolbarDisplayModeIconAndLabel
、NSToolbarDisplayModeIconOnly
等)会影响项目的显示方式,从而间接影响布局。例如,NSToolbarDisplayModeIconOnly
会使项目以图标形式紧凑显示,而NSToolbarDisplayModeIconAndLabel
会在图标旁边显示标签,占用更多空间。 - 对于自定义布局,可以创建自定义的
NSToolbarItem
视图,通过设置视图的frame
和约束来实现更精细的布局控制。但在大多数情况下,默认的布局方式对于常见需求已经足够。
- Mac OS 工具栏有其默认的布局方式。当添加或移除项目时,工具栏会自动重新排列项目。
- 交互逻辑:
- 每个
NSToolbarItem
都可以设置target
和action
,当用户点击工具栏项目时,会调用指定target
的action
方法。例如,在上述代码中,item1
的action
是handleItem1Action:
,当用户点击item1
时,会执行handleItem1Action:
方法,在该方法中可以实现添加新工具栏项目的逻辑。 - 当添加或移除项目时,需要考虑项目之间的逻辑关系。例如,如果移除某个项目会影响其他项目的功能,需要相应地更新其他项目的状态(如禁用某些相关功能)。同时,还可以根据项目的状态(如是否可用)来更改其外观,如禁用的项目可以显示为灰色。
- 每个
- 布局:
在上述代码中,addToolbarItem
方法实现了添加工具栏项目的功能,removeToolbarItem
方法实现了移除工具栏项目的功能。通过 handleItem1Action:
和 handleNewItemAction:
方法来处理用户点击工具栏项目的交互逻辑。