NSComboBox輸入字符時(shí)自動(dòng)打開下拉菜單并匹配

NSComboBox抵栈,此功能實(shí)現(xiàn)的效果圖如下圖所示:


1.? ? ? 首先調(diào)用NSComboBox的父類NSTextField的delegate方法,實(shí)現(xiàn)實(shí)時(shí)輸入監(jiān)測(cè)庞呕。其中比較關(guān)鍵的方法是-(void)controlTextDidChange:(NSNotification*)notification,這個(gè)方法可以實(shí)現(xiàn)輸入內(nèi)容的實(shí)時(shí)監(jiān)測(cè)巢音。

-(void)controlTextDidChange:(NSNotification*)notification

{

id object = [notification object];

[object setComplete:YES];//這個(gè)函數(shù)可以實(shí)現(xiàn)自動(dòng)匹配功能

}

2. ?可以看到鳍贾,在NSComboBox控件的右邊有一個(gè)標(biāo)有下三角的按鈕,這個(gè)按鈕在鼠標(biāo)點(diǎn)擊后才彈出下拉菜單來般贼,但是我們?cè)谳斎氲臅r(shí)候沒有實(shí)現(xiàn)鼠標(biāo)事件愧哟,所以下來菜單無法彈出奥吩,因此需要模擬鼠標(biāo)事件-(void)mouseDown:(NSEvent*)theEvent,但是這個(gè)按鈕是NSComboBoxCell中的私有變量蕊梧,所以我們重新創(chuàng)建一個(gè)類霞赫,這個(gè)類繼承NSComboBoxCell,這樣我們就可以應(yīng)用它的私有變量了肥矢。

繼承NSComboBox類:

@interface ComboBoxCell : NSComboBoxCell

{

}

- (void)popUpList;

- (void)closePopUpWindow;

- (BOOL)isPopUpWindowVisible;

@end

@implementation ComboBoxCell

- (void)popUpList

{

if ([self isPopUpWindowVisible])

{

return;

}

else

{

[_buttonCell performClick:nil];//模擬鼠標(biāo)事件

}

}

- (void)closePopUpWindow

{

if ([self isPopUpWindowVisible])

{

[_popUp close];

}

}

- (BOOL)isPopUpWindowVisible

{

return [_popUp isVisible];

}

@end

3.? 實(shí)現(xiàn)NSComboBox類的Datasource方法:

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

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

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

這是Datasource方法端衰,我們需要重寫此方法。下面是三個(gè)方法的實(shí)現(xiàn)甘改,方法中的結(jié)構(gòu)體可以根據(jù)用戶的需要自定義旅东。

- (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];

}

做到這里,這個(gè)功能就基本實(shí)現(xiàn)了十艾,本文中的代碼來自正在開發(fā)的工程抵代,讀者只需替換響應(yīng)的結(jié)構(gòu)體,即可實(shí)現(xiàn)功能忘嫉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荤牍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子庆冕,更是在濱河造成了極大的恐慌康吵,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愧杯,死亡現(xiàn)場(chǎng)離奇詭異涎才,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)力九,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門耍铜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人跌前,你說我怎么就攤上這事棕兼。” “怎么了抵乓?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵伴挚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我灾炭,道長(zhǎng)茎芋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任蜈出,我火速辦了婚禮田弥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铡原。我一直安慰自己偷厦,他們只是感情好商叹,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著只泼,像睡著了一般剖笙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上请唱,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天弥咪,我揣著相機(jī)與錄音,去河邊找鬼十绑。 笑死酪夷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的孽惰。 我是一名探鬼主播晚岭,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼勋功!你這毒婦竟也來了坦报?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤狂鞋,失蹤者是張志新(化名)和其女友劉穎片择,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骚揍,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡字管,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了信不。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘲叔。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖抽活,靈堂內(nèi)的尸體忽然破棺而出硫戈,到底是詐尸還是另有隱情,我是刑警寧澤下硕,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布丁逝,位于F島的核電站,受9級(jí)特大地震影響梭姓,放射性物質(zhì)發(fā)生泄漏霜幼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宿崭,春花似錦愿阐、人聲如沸萝衩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猩谊。三九已至,卻和暖如春祭刚,著一層夾襖步出監(jiān)牢的瞬間牌捷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國打工涡驮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暗甥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓捉捅,卻偏偏與公主長(zhǎng)得像撤防,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子棒口,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 概述在iOS開發(fā)中UITableView可以說是使用最廣泛的控件寄月,我們平時(shí)使用的軟件中到處都可以看到它的影子,類似...
    liudhkk閱讀 9,067評(píng)論 3 38
  • 哦吼吼无牵,又研究了幾天漾肮,把FMDB這個(gè)封裝好的數(shù)據(jù)庫搞定了,寫了個(gè)簡(jiǎn)單的例子茎毁,基于FMDB的添刪改查操作克懊,界面很一般...
    lichengjin閱讀 531評(píng)論 0 0
  • 作者唯一QQ:228544117。七蜘。谭溉。。橡卤。 =========后面的都要新建一個(gè)文章 AppDelegate.h ...
    CC_iOS閱讀 877評(píng)論 0 0
  • 前言 最近忙完項(xiàng)目比較閑夜只,想寫一篇博客來分享一些自學(xué)iOS的心得體會(huì),希望對(duì)迷茫的你有所幫助蒜魄。博主非科班出身扔亥,一些...
    GitHubPorter閱讀 1,438評(píng)論 9 5
  • 1、設(shè)置UILabel行間距 NSMutableAttributedString* attrString = [[...
    十年一品溫如言1008閱讀 1,667評(píng)論 0 3