簡體   English   中英

NSTextfield + NSMenu和第一響應者

[英]NSTextfield + NSMenu and first responder

我正在嘗試實現自己的自動補全系統(結果是從sqlite數據庫中提取的)

我已經設置了NSTextField和適當的委托。 每次NSTextField中的文本更改時,它都會調用- (void)controlTextDidChange:(NSNotification *)aNotification方法

它工作正常,在這種方法中,我以編程方式構建菜單,最后使用該代碼調用/顯示了它:

 NSRect frame = [address frame];
NSPoint menuOrigin = [[address superview] convertPoint:NSMakePoint(frame.origin.x, frame.origin.y+frame.size.height-25)
                                                toView:nil];

NSEvent *event =  [NSEvent mouseEventWithType:NSLeftMouseDown
                                     location:menuOrigin
                                modifierFlags:NSLeftMouseDownMask // 0x100
                                    timestamp:0
                                 windowNumber:[[address window] windowNumber]
                                      context:[[address window] graphicsContext]
                                  eventNumber:0
                                   clickCount:1
                                     pressure:1]; 
[NSMenu popUpContextMenu:menu withEvent:event forView:address];

address是我的NSTextFieldmenu是我的NSMenu 問題在於菜單是焦點,因此您只能在文本字段中鍵入1個字母,然后再也不能鍵入文本,因為菜單現在是第一響應者。

我的問題是如何顯示菜單並保持文本字段為第一響應者,以便您可以在字段中每次更改文本時重新加載菜單時鍵入文本。

實際上,它應該像在Safari或chrome地址欄中。

我認為NSMenu不可能做到這一點。 NSMenu實現是由系統在相當低的級別上控制的,旨在將鍵盤焦點對准。 您需要創建自己的視圖或窗口,看起來像菜單,但不使用NSMenu。 例如,請注意,chrome地址欄中的菜單看起來不像標准的NSMenu。 您需要創建一個將顯示和繪制的視圖,並接收回調或通知以在用戶鍵入時進行更新,但不會占據鍵盤焦點。 NSView(實際上是NSResponder)上有一些方法可以控制視圖是否接受第一響應者狀態。

正如mgorbach所說,使用NSMenu並不是真的可能。 我已經切換到NSTableView並自定義了我的文本字段。 文本字段將向上和向下箭頭前進到“表格”視圖,這樣可以正常工作!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM