[英]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
是我的NSTextField
, menu
是我的NSMenu
。 問題在於菜單是焦點,因此您只能在文本字段中鍵入1個字母,然后再也不能鍵入文本,因為菜單現在是第一響應者。
我的問題是如何顯示菜單並保持文本字段為第一響應者,以便您可以在字段中每次更改文本時重新加載菜單時鍵入文本。
實際上,它應該像在Safari或chrome地址欄中。
我認為NSMenu不可能做到這一點。 NSMenu實現是由系統在相當低的級別上控制的,旨在將鍵盤焦點對准。 您需要創建自己的視圖或窗口,看起來像菜單,但不使用NSMenu。 例如,請注意,chrome地址欄中的菜單看起來不像標准的NSMenu。 您需要創建一個將顯示和繪制的視圖,並接收回調或通知以在用戶鍵入時進行更新,但不會占據鍵盤焦點。 NSView(實際上是NSResponder)上有一些方法可以控制視圖是否接受第一響應者狀態。
正如mgorbach所說,使用NSMenu並不是真的可能。 我已經切換到NSTableView並自定義了我的文本字段。 文本字段將向上和向下箭頭前進到“表格”視圖,這樣可以正常工作!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.