Mac开发_NSComboBox

0、前言

  • NSComboBox是Cocoa框架中的一个控件,用于在下拉列表中显示可选项,允许用户从中选择一个选项或输入自定义内容。
  • 它可以用于许多场景,例如选择器、搜索框、标签选择等。

1、创建示例

  • 1.1 基础创建

// 创建
NSComboBox *combo_box = [[NSComboBox alloc] init];
// 添加
[self.window.contentView addSubview:combo_box];
// 设置位置尺寸
combo_box.frame = NSMakeRect(20, 400, 150, 30);
  • 1.2 外貌样式

// 用于控制是否显示垂直滚动条。
// 如果设置为YES,则当下拉列表中的项目数超过numberOfVisibleItems时,将会显示垂直滚动条。
combo_box.hasVerticalScroller = NO;
// 用于设置下拉列表中单元格之间的间距。
combo_box.intercellSpacing = NSMakeSize(60, 20);
// 用于设置下拉列表中每个项目的高度。
combo_box.itemHeight = 80;
// 用于控制下拉按钮的边框样式。如果设置为YES,则下拉按钮将显示边框。
combo_box.buttonBordered = YES;

// 用于设置下拉列表中可见的项目数。
combo_box.numberOfVisibleItems = 3;
// 用于获取下拉列表中项目的数量。
NSInteger numberOfItems = combo_box.numberOfItems;
NSLog(@"用于获取下拉列表中项目的数量 == %@", @(numberOfItems));
// 用于控制是否启用自动完成功能。如果设置为YES,则用户在输入时会自动匹配下拉列表中的项目。
combo_box.completes = NO;
  • 1.3 查找、选中、滚动至

// 用于获取当前选中的项目的索引值。
NSInteger indexOfSelectedItem = combo_box.indexOfSelectedItem;
NSLog(@"用于获取当前选中的项目的索引值 == %@", @(indexOfSelectedItem));

// 返回指定索引处的项的对象值。
id item_obj = [combo_box itemObjectValueAtIndex:2];
NSLog(@"item_obj == %@", item_obj);
// 用于获取当前选中的项目的值。
id objectValueOfSelectedItem = combo_box.objectValueOfSelectedItem;
NSLog(@"用于获取当前选中的项目的值 == %@", objectValueOfSelectedItem);
// 返回指定对象值的项的索引。如果没有找到匹配的项,则返回NSNotFound。
NSInteger index = [combo_box indexOfItemWithObjectValue:@(23)];
NSLog(@"index == %@", @(index));

// 选择下拉列表中指定索引处的项目。
[combo_box selectItemAtIndex:2];
// 取消选择下拉列表中指定索引处的项目。
[combo_box deselectItemAtIndex:2];
// 选择下拉列表中与指定对象值匹配的项目。
[combo_box selectItemWithObjectValue:@(23)];

// 将下拉列表中指定索引处的项目滚动到顶部。
[combo_box scrollItemAtIndexToTop:2];
// 将下拉列表中指定索引处的项目滚动到可见区域。
[combo_box scrollItemAtIndexToVisible:2];
  • 1.4 其他设置

// 重新加载数据,可以用于更新下拉列表中的选项内容。
[combo_box reloadData];
// 通知下拉列表的数据源中的项目数量已更改,以便更新下拉列表的大小。
[combo_box noteNumberOfItemsChanged];

// 用于设置下拉列表中的项目值。可以通过NSArray或NSMutableArray对象来设置。
NSArray *objectValues = combo_box.objectValues;
NSLog(@"用于设置下拉列表中的项目值 == %@", objectValues);
  • 1.5 代理

// 用于设置NSComboBox的代理对象,以便处理与下拉列表相关的事件和操作。
combo_box.delegate = self;

#pragma mark - NSComboBoxDelegate
// 表示下拉列表即将弹出时调用的方法,可以在该方法中进行一些初始化操作或者修改下拉列表的内容。
- (void)comboBoxWillPopUp:(NSNotification *)notification {
    
}

// 表示下拉列表即将消失时调用的方法,可以在该方法中进行一些清理操作或者记录用户所选的内容。
- (void)comboBoxWillDismiss:(NSNotification *)notification {
    
}

// 示下拉列表中选择的内容已经发生变化时调用的方法,可以在该方法中响应用户的选择,并进行相应的操作。
- (void)comboBoxSelectionDidChange:(NSNotification *)notification {
    NSComboBox *comboBox = notification.object;
    NSInteger selectedIndex = comboBox.indexOfSelectedItem;

    NSLog(@"comboBoxSelectionDidChange selected item %@", self.datas[selectedIndex]);
}

// 表示用户正在改变下拉列表中选择的内容时调用的方法,可以在该方法中实时响应用户的操作,例如根据用户输入实时更新下拉列表的内容。
- (void)comboBoxSelectionIsChanging:(NSNotification *)notification {
    
    NSComboBox *comboBox = notification.object;
    NSInteger selectedIndex = comboBox.indexOfSelectedItem;
    
    NSLog(@"comboBoxSelectionIsChanging selected item %@",self.datas[selectedIndex]);
}
  • 1.6 效果

2、不使用数据源

// 设置是否使用数据源来提供下拉列表中的项目。
combo_box.usesDataSource = NO;

// 向下拉列表中添加一个项目。
[combo_box addItemWithObjectValue:@(23)];
// 向下拉列表中添加多个项目。
[combo_box addItemsWithObjectValues:@[@(23), @"桂林"]];
// 在指定索引处插入一个项目。
[combo_box insertItemWithObjectValue:@(23) atIndex:2];

// 从下拉列表中删除指定项目。
[combo_box removeItemWithObjectValue:@(23)];
// 从下拉列表中删除指定索引处的项目。
[combo_box removeItemAtIndex:2];
// 从下拉列表中删除所有项目。
[combo_box removeAllItems];
        
// 添加选中事件
combo_box.target = self;
combo_box.action = @selector(comboBox_Selecte:);

- (void)comboBox_Selecte:(NSNotification *)notification {
    NSComboBox *comboBox = [notification object];
    NSInteger selectedIndex = [comboBox indexOfSelectedItem];
    NSString *selectedItem = [comboBox itemObjectValueAtIndex:selectedIndex];
    NSLog(@"Selected item: %@", selectedItem);
}

3、使用数据源

self.datas = @[@"小学", @"初中", @"高中",];

// 设置是否使用数据源来提供下拉列表中的项目。
combo_box.usesDataSource = YES;
// 用于设置NSComboBox的数据源对象,以便提供下拉列表中的项目数据。
combo_box.dataSource = self;

#pragma mark - NSComboBoxDataSource
// 这个方法用于返回下拉列表中的选项数量。
// 你需要在这个方法中返回一个整数,代表下拉列表中的选项数量。
// 例如,如果你的下拉列表中有5个选项,那么你应该返回5。
- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox {
    return self.datas.count;
}

// 这个方法用于返回下拉列表中指定索引位置的选项。
// 你需要在这个方法中根据索引位置返回一个对象,这个对象代表下拉列表中指定索引位置的选项。
// 例如,如果你的下拉列表中有5个选项,你可以使用一个数组来存储这5个选项,
// 然后在这个方法中返回数组中指定索引位置的对象。
- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index {
    return self.datas[index];
}

// 开启时就选中第几个项目
- (NSUInteger)comboBox:(NSComboBox *)comboBox indexOfItemWithStringValue:(NSString *)string {
    return 2;
}

// 用于在用户输入文本时提供自动补全功能。
// 举个例子,假设我们有一个 NSComboBox 对象,其中包含了一些字符串,比如 "apple", "banana", "orange"。
// 用户在输入框中输入 "a" 时,我们希望自动补全为 "apple"。
- (nullable NSString *)comboBox:(NSComboBox *)comboBox completedString:(NSString *)string {
    // 遍历所有的字符串,寻找以输入的字符串开头的字符串
    for (NSString *item in comboBox.objectValues) {
        if ([item hasPrefix:string]) {
            return item;
        }
    }
    return nil;
}

4、API说明

// 下拉列表将要弹出通知
APPKIT_EXTERN NSNotificationName NSComboBoxWillPopUpNotification;
// 下拉列表将要关闭通知
APPKIT_EXTERN NSNotificationName NSComboBoxWillDismissNotification;
// 下拉列表选中行改变通知
APPKIT_EXTERN NSNotificationName NSComboBoxSelectionDidChangeNotification;
// 下拉列表选中行正在改变通知
APPKIT_EXTERN NSNotificationName NSComboBoxSelectionIsChangingNotification;

@protocol NSComboBoxDataSource <NSObject>
@optional

/**
 * @brief 返回下拉列表中项目的数量
 *
 * @param comboBox 下拉列表
 * @return         下拉列表中项目的数量
 */
- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)comboBox NS_SWIFT_UI_ACTOR;

/**
 * @brief 返回指定索引处的对象值
 *
 * @param comboBox 下拉列表
 * @param index    要检索的对象值的索引
 * @return         指定索引处的对象值,或者为nil(如果该对象不存在)
 */
- (nullable id)comboBox:(NSComboBox *)comboBox objectValueForItemAtIndex:(NSInteger)index NS_SWIFT_UI_ACTOR;

/**
 * @brief 返回包含指定字符串值的下拉列表中的项目的索引
 *
 * @param comboBox 下拉列表
 * @param string   用于查找项目的字符串值
 * @return         包含指定字符串值的下拉列表中的项目的索引,或者为NSNotFound(如果没有找到)
 */
- (NSUInteger)comboBox:(NSComboBox *)comboBox indexOfItemWithStringValue:(NSString *)string NS_SWIFT_UI_ACTOR;

/**
 * @brief 在用户输入完成后返回最匹配的已知字符串值
 *
 * @param comboBox 下拉列表
 * @param string   用户输入完成的字符串
 * @return         最匹配的已知字符串值
 */
- (nullable NSString *)comboBox:(NSComboBox *)comboBox completedString:(NSString *)string NS_SWIFT_UI_ACTOR;

@end

@protocol NSComboBoxDelegate <NSTextFieldDelegate>
@optional
/**
 * @brief 下拉列表即将弹出时调用
 *
 * @param notification 通知对象,包含下拉列表
 */
- (void)comboBoxWillPopUp:(NSNotification *)notification NS_SWIFT_UI_ACTOR;

/**
 * @brief 下拉列表即将关闭时调用
 *
 * @param notification 通知对象,包含下拉列表
 */
- (void)comboBoxWillDismiss:(NSNotification *)notification NS_SWIFT_UI_ACTOR;

/**
 * @brief 下拉列表选中项发生更改时调用
 *
 * @param notification 通知对象,包含下拉列表
 */
- (void)comboBoxSelectionDidChange:(NSNotification *)notification NS_SWIFT_UI_ACTOR;

/**
 * @brief 下拉列表选中项正在更改时调用
 *
 * @param notification 通知对象,包含下拉列表
 */
- (void)comboBoxSelectionIsChanging:(NSNotification *)notification NS_SWIFT_UI_ACTOR;

@end

@interface NSComboBox : NSTextField

/** 是否显示纵向滚动条 */
@property BOOL hasVerticalScroller;
/** 单元格之间的间隔大小 */
@property NSSize intercellSpacing;
/** 每个项的高度 */
@property CGFloat itemHeight;
/** 可见的行数 */
@property NSInteger numberOfVisibleItems;
/** 按钮是否有边框 */
@property(getter=isButtonBordered) BOOL buttonBordered;

/**
 * @brief 重新加载下拉列表的数据
 */
- (void)reloadData;

/**
 * @brief 通知下拉列表中的项目数量已更改
 */
- (void)noteNumberOfItemsChanged;

/** 是否使用数据源的方式来填充下拉列表 */
@property BOOL usesDataSource;

/**
 * @brief 滚动 NSComboBox 中指定索引的项至顶部
 *
 * @param index     要滚动的项的索引
 */
- (void)scrollItemAtIndexToTop:(NSInteger)index;

/**
 * @brief 将 NSComboBox 中指定索引的项滚动到可见区域内
 *
 * @param index     要滚动的项的索引
 */
- (void)scrollItemAtIndexToVisible:(NSInteger)index;

/**
 * @brief 选中 NSComboBox 中指定索引的项
 *
 * @param index     要选中的项的索引
 */
- (void)selectItemAtIndex:(NSInteger)index;

/**
 * @brief 取消选中 NSComboBox 中指定索引的项
 *
 * @param index     要取消选中的项的索引
 */
- (void)deselectItemAtIndex:(NSInteger)index;

/** 当前选中项在下拉列表中的索引 */
@property(readonly) NSInteger indexOfSelectedItem;
/** 下拉列表中的项目数量 */
@property(readonly) NSInteger numberOfItems;
/** 是否允许自动完成输入内容 */
@property BOOL completes;
/** 下拉列表代理对象,用于响应下拉列表相关事件 */
@property(nullable, weak) id<NSComboBoxDelegate> delegate;
/** 下拉列表数据源对象,提供下拉列表的数据内容 */
@property(nullable, assign) id<NSComboBoxDataSource> dataSource;

/**
 * @brief 添加一个带有对象值的项到NSComboBox中
 *
 * @param object    要添加的对象值
 */
- (void)addItemWithObjectValue:(id)object;

/**
 * @brief 通过NSArray中的对象值批量添加项到NSComboBox中
 *
 * @param objects   包含要添加的对象值的NSArray
 */
- (void)addItemsWithObjectValues:(NSArray *)objects;

/**
 * @brief 在指定索引处插入一个带有对象值的项到NSComboBox中
 *
 * @param object    要插入的对象值
 * @param index     要插入项的索引
 */
- (void)insertItemWithObjectValue:(id)object atIndex:(NSInteger)index;

/**
 * @brief 从NSComboBox中删除具有指定对象值的项
 *
 * @param object    要删除的对象值
 */
- (void)removeItemWithObjectValue:(id)object;

/**
 * @brief 删除指定索引处的项
 *
 * @param index     要删除的项的索引
 */
- (void)removeItemAtIndex:(NSInteger)index;

/**
 * @brief 删除NSComboBox中的所有项
 */
- (void)removeAllItems;

/**
 * @brief 选择具有指定对象值的项
 *
 * @param object    要选择的对象值
 */
- (void)selectItemWithObjectValue:(nullable id)object;

/**
 * @brief 检索具有指定索引的项的对象值
 *
 * @param index     要检索对象值的项的索引
 *
 * @return          指定索引处项的对象值
 */
- (id)itemObjectValueAtIndex:(NSInteger)index;

/** 当前选中项的对象值 */
@property(nullable, readonly, strong) id objectValueOfSelectedItem;

/**
 * @brief 查找给定对象值的列表项的索引
 *
 * @param object     要查找的对象值
 *
 * @return           对象值所在的列表项的索引,如果未找到,则返回NSNotFound
 */
- (NSInteger)indexOfItemWithObjectValue:(id)object;
/** 下拉列表框中的选项数组 */
@property(readonly, copy) NSArray *objectValues;

@end
posted @ 2022-09-17 20:00  CH520  阅读(316)  评论(0编辑  收藏  举报