2013-03-03 53 views
2

OK,這是我的情況:textDidEndEditing: - 如何過濾「返回」鍵?

  • 我使用的是NSTextField
  • 我觀察NSTextDidEndEditingNotification通知

這是最後的方法:

- (void)handleConsoleInput:(NSNotification*)not 

這每當(至少從我注意到的)用戶處發出通知:

  • 按 「返回」
  • 按 「選項卡」
  • 點擊了NSTextField

然而,我(顯然)要限制它的 「返回」 鍵。

我該怎麼做?我測試了發送的NSNotification對象的內容,並且沒有關於觸發textDidEndEditing:通知的關鍵代碼或事件的信息。

任何想法?


編輯:

只注意到:

  • 當用戶點擊出NSTextField的,[[not userInfo] valueForKey:@"NSTextMovement"]變得0這意味着該情況下可以進行過濾。
  • 然而,如何區分「標籤」和「返回」,它們都返回NSTextMovement>0
+1

這有點複雜。爲什麼不僅僅是子類的東西? – CodaFi 2013-03-03 08:57:27

+0

@CodaFi您的回答是正確的(對於更多*完整的*方法,對於任何感興趣的人:http:// stackoverflow。com/questions/10994663/keydownnsevent-event-is-not-invoked-when-the-focus-is-on-a-text-field)。請發表您的評論作爲一個正確的答案,我會給你你應得的所有榮譽。非常感謝,夥計! :-) – 2013-03-03 09:03:38

+0

我們如何過濾空間鍵? – 2016-01-03 13:46:09

回答

3

如果你真的覺得訂閱該通知是最有效的方法來解決這個問題,給你更多的權力,但我覺得讓你的NSTextField繼承並覆蓋相關的事件方法會更容易。但是,那就是不管,這裏有一個快速實現的東西,我認爲它應該是這樣的:

- (void)handleConsoleInput:(NSNotification*)notification { 
    NSUInteger textMove = [notification.userInfo[@"NSTextMovement"] unsignedIntegerValue]; 
    if (textMove != NSReturnTextMovement) { 
     [self.window makeFirstResponder:notification.object]; 
    } 
} 

結束事件的類型是NSText文檔中列舉。

+0

再次感謝! ;-) – 2013-03-03 09:10:24

+0

+1,用於提示更好的解決方案:-) – 2013-03-03 09:23:22

2

NSDictionary *userInfo = [notification userInfo]; 
int movement = [[userInfo objectForKey:@"NSTextMovement"] intValue]; 
NSTextDidEndEditingNotification

的可能值在「NSText類參考」記錄爲Movement Codes

enum { 
    NSIllegalTextMovement = 0, 
    NSReturnTextMovement = 0x10, 
    NSTabTextMovement  = 0x11, 
    NSBacktabTextMovement = 0x12, 
    NSLeftTextMovement = 0x13, 
    NSRightTextMovement = 0x14, 
    NSUpTextMovement  = 0x15, 
    NSDownTextMovement = 0x16, 
    NSCancelTextMovement = 0x17, 
    NSOtherTextMovement = 0 
}; 
+0

哇。這太有趣了。我不知道......我最終試驗了@ CodaFi的方法 - 哪些方法可以工作。但是你的方法絕對解決了我的方法。所以+1。 (真的信息也!)謝謝隊友! :-) – 2013-03-03 09:09:36

+0

+1,因爲比我快得多;) – CodaFi 2013-03-03 09:11:23