美文网首页MAC 开发MacOSMacOS开发 技术集锦
NSComboBox输入字符时自动打开下拉菜单并匹配

NSComboBox输入字符时自动打开下拉菜单并匹配

作者: jiaoguifeng | 来源:发表于2016-04-21 15:52 被阅读482次

NSComboBox,此功能实现的效果图如下图所示:

1.      首先调用NSComboBox的父类NSTextField的delegate方法,实现实时输入监测。其中比较关键的方法是-(void)controlTextDidChange:(NSNotification*)notification,这个方法可以实现输入内容的实时监测。

-(void)controlTextDidChange:(NSNotification*)notification

{

id object = [notification object];

[object setComplete:YES];//这个函数可以实现自动匹配功能

}

2.  可以看到,在NSComboBox控件的右边有一个标有下三角的按钮,这个按钮在鼠标点击后才弹出下拉菜单来,但是我们在输入的时候没有实现鼠标事件,所以下来菜单无法弹出,因此需要模拟鼠标事件-(void)mouseDown:(NSEvent*)theEvent,但是这个按钮是NSComboBoxCell中的私有变量,所以我们重新创建一个类,这个类继承NSComboBoxCell,这样我们就可以应用它的私有变量了。

继承NSComboBox类:

@interface ComboBoxCell : NSComboBoxCell

{

}

- (void)popUpList;

- (void)closePopUpWindow;

- (BOOL)isPopUpWindowVisible;

@end

@implementation ComboBoxCell

- (void)popUpList

{

if ([self isPopUpWindowVisible])

{

return;

}

else

{

[_buttonCell performClick:nil];//模拟鼠标事件

}

}

- (void)closePopUpWindow

{

if ([self isPopUpWindowVisible])

{

[_popUp close];

}

}

- (BOOL)isPopUpWindowVisible

{

return [_popUp isVisible];

}

@end

3.  实现NSComboBox类的Datasource方法:

- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox;

- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index;

- (NSUInteger)comboBox:(NSComboBox *)aComboBox indexOfItemWithStringValue:(NSString *)string;

这是Datasource方法,我们需要重写此方法。下面是三个方法的实现,方法中的结构体可以根据用户的需要自定义。

- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox

{

NSInteger row = 0;

if (currentBoxIndex_ == -1)

{

return row;

}

DBBoxManager *currentBox = [[DBManager defaultDBManager] boxAtIndex:currentBoxIndex_];

if ([vendorControl_ isEqual:aComboBox])

{

row = [currentBox userDefineVenderInfos].count;

}

else if ([categoryControl_ isEqual:aComboBox])

{

row = [currentBox userDefineCategoryInfos].count;

}

else if ([paymentControl_ isEqual:aComboBox])

{

row = [currentBox userDefinePaymentInfos].count;

}

else if ([purposeControl_ isEqual:aComboBox])

{

row = [currentBox userDefinePurposeInfos].count;

}

else if ([categorySelectBtn_ isEqual:aComboBox])

{

row = [currentBox userDefineCategoryInfos].count;

}

else if([vendorSelectBtn_ isEqual:aComboBox])

{

row = [currentBox userDefineVenderInfos].count;

}

row = row + 1;

return row;

}

- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index

{

NSString *content = nil;

if (currentBoxIndex_ == -1)

{

return content;

}

NSMutableArray *array = nil;

DBBoxManager *currentBox = [[DBManager defaultDBManager] boxAtIndex:currentBoxIndex_];

if ([vendorControl_ isEqual:aComboBox])

{

array = [currentBox userDefineVenderInfos];

}

else if ([categoryControl_ isEqual:aComboBox])

{

array = [currentBox userDefineCategoryInfos];

}

else if ([paymentControl_ isEqual:aComboBox])

{

array = [currentBox userDefinePaymentInfos];

}

else if ([purposeControl_ isEqual:aComboBox])

{

array = [currentBox userDefinePurposeInfos];

}

else if ([categorySelectBtn_ isEqual:aComboBox])

{

array = [currentBox userDefineCategoryInfos];

}

else if ([vendorSelectBtn_ isEqual:aComboBox])

{

array = [currentBox userDefineVenderInfos];

}

if (index == 0)

{

content = @"";

}

else

{

NSDictionary *dic = [array objectAtIndex:index - 1];

content = (NSString *)[dicobjectForKey:kUserDefinedBoxValue];

}

return content;

}

- (NSUInteger)comboBox:(NSComboBox *)aComboBox indexOfItemWithStringValue:(NSString *)string

{

DBBoxManager *currentBox = [[DBManager defaultDBManager] boxAtIndex:currentBoxIndex_];

NSMutableArray *comboxList = nil;

if ([aComboBox isEqual:vendorControl_])

{

comboxList = [currentBox userDefineVenderInfos];

}

else if([aComboBox isEqual:categoryControl_])

{

comboxList = [currentBox userDefineCategoryInfos];

}

else if([aComboBox isEqual:paymentControl_])

{

comboxList = [currentBox userDefinePaymentInfos];

}

else if([aComboBox isEqual:purposeControl_])

{

comboxList = [currentBox userDefinePurposeInfos];

}

NSMutableArray *newList = [[[NSMutableArray alloc] initWithCapacity:0] autorelease];

[newList addObject:@""];

for (int i = 0; i < [comboxList count]; i++)

{

NSString *name = [[comboxList objectAtIndex:i] objectForKey:kUserDefinedBoxValue];

[newList addObject:name];

}

return [newList indexOfObject:string];

}

做到这里,这个功能就基本实现了,本文中的代码来自正在开发的工程,读者只需替换响应的结构体,即可实现功能。

相关文章

  • NSComboBox输入字符时自动打开下拉菜单并匹配

    NSComboBox,此功能实现的效果图如下图所示: 1. 首先调用NSComboBox的父类NSTextFi...

  • 今天和大家分享下Auto-Complete 实战技术

    也就是输入框自动提示完成功能,如何结合我们的数据库来实现用户在输入一个字符串的部分内容时,就提供下拉菜单自动推荐相...

  • 正则表达式规则

    ^ 匹配输入字符串的开始输入:addddreg:^a结果:a $ 匹配输入字符串的结尾输入:adddbreg:b...

  • 正则表达式记录

    字符说明^ 为匹配输入字符串的开始位置$ 为匹配输入字符串的结束位置[0-9]+匹配多个数字, [0-9] 匹配单...

  • 隐藏软键盘

    Activity中存在输入框时,总会自动定位到输入框并打开软键盘,可以在AndroidManifest.xml中进...

  • Mysql阶段总结

    正则表达式: ^匹配输入字符串的开始位置。 $匹配输入字符串的结束位置。 .匹配除 "\n" 之外的任何单个字符。...

  • Swift 正则表达式

    " 字符本身,请使用 "$" 修饰匹配次数为至少 1 次。要匹配 "+" 字符本身,请使用 "+" ^ 匹配输入字...

  • 回顾常见的正则表达式用法

    $匹配输入字符串的结尾位置 ^ 匹配输入字符串的开始位置 * 匹配前面的子表达式零次或多次 + 匹配前面的子表达式...

  • 正则表达式

    正则表达式中的特殊字符 \ 匹配一个字符边界,表示下一个字符是特殊的$ 匹配输入的结束^ 匹配输入的开始*匹配前一...

  • Vue element下拉菜单实现键盘事件上下移

    需求 提高用户体验感,输入框自动聚焦并键盘控制下拉菜单的选项上下移效果如图: 初期使用的el-dropdown下拉...

网友评论

    本文标题: NSComboBox输入字符时自动打开下拉菜单并匹配

    本文链接:https://www.haomeiwen.com/subject/eumtrttx.html