2012-09-02 39 views
1

我想要子類NSTokenField顯示一個NSPopover或一個控件獲得焦點後有一些選項的菜單。不幸的是,在幾天的嘗試中,我開始認爲這是不可能的。當NSTokenField成爲第一響應者時,我該如何執行一個動作(顯示彈出框)?

這裏是我到目前爲止已經試過:

  • -textDidBeginEditing-controlTextDidBeginEditing是無用的,因爲他們得到所謂的用戶鍵入的第一個字母之後。我需要一些在焦點上被解僱的東西。
  • 覆蓋-becomeFirstResponder-resignFirstResponder來顯示和隱藏菜單或彈出窗口也沒有用。 tokenfield顯然將第一個響應者狀態傳遞給一個私人視圖(NSTokenFieldView),所以-resignFirsttResponder-becomeFirstReponder之後立即關閉菜單或彈出窗口。
  • 我試圖在解僱菜單-resignFirstResponder之前查看-currentEditor的值。當控件處於編輯模式時,-currentEditor應該不爲零,但不幸的是,只有在調用令牌字段中的-resignFirstResponder後才設置其值,並且菜單再次立即關閉。
  • 我試着子類的NSTokenFieldCell並覆蓋其-editWithFrame:-selectWithFrame:方法,但與我的自定義NSTokenFieldCell的tokenfield完全不顯示,沒有錯誤或異常報告。

有關如何做到這一點的任何想法?有人做過嗎?

+0

您究竟需要如何解散popover?您當然可以在acceptedFirstResponder或BecomeFirstResponder中顯示它,但您如何解除它取決於接下來在工作流程中發生的情況。一旦開始輸入文字,你可以在文本編輯委託方法之一中解僱它。 – rdelmar

+0

是的,它工作得很漂亮!現在我在'-becomeFirstResponder'上顯示彈出窗口,並在'-textDidEndEditing'上關閉它。我不知道爲什麼我沒有想到它。非常感謝。 – Jacopo

回答

2

這是有效的。我通過觀察父窗口的firstResponder屬性來做到這一點。如果令牌字段或其任何包含NSResponder成爲第一響應者,則顯示彈出窗口。

@implementation AppDelegate 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    // Insert code here to initialize your application 
    [ self.window addObserver:self forKeyPath:@"firstResponder" options:NSKeyValueObservingOptionNew context:nil ] ; 
} 

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if (object == self.window && [ keyPath isEqualToString:@"firstResponder" ]) 
    { 
     NSResponder * responder = [ change valueForKey:NSKeyValueChangeNewKey ] ; 

     while (NULL != responder) 
     { 
      if (responder == self.tokenField) 
      { 
       // show popover (if not showing) 
       NSLog(@"Show popover!\n") ; 
       return ; 
      } 
      responder = responder.nextResponder ; 
     } 

     NSLog(@"Hide popover!\n") ; 
    } 
    else 
    { 
     [ super observeValueForKeyPath:keyPath ofObject:object change:change context:context ] ; 
    } 
} 

@end 
+0

您必須「去抖」_show popover_信號 - 它可能會根據「show」消息多次調用。我沒有進行子類化 - 觀察機制在AppDelegate /窗口所有者,但你可以很容易地修改這個工作在NSTokenField的自定義子類中工作 – nielsbot

+0

謝謝我解決了使用主帖子評論的方法。 – Jacopo

相關問題