2008-08-14 35 views
15

我正在慢慢學習Objective-C和Cocoa,並且我迄今爲止在文本視圖中捕獲關鍵事件的唯一方式是使用委派,但我無法找到有用的文檔和有關如何實現此類示例的示例解。任何人都可以指引我正確的方向或提供一些第一手的幫助?在NSTextView中捕獲關鍵事件的最佳方式?

回答

14

一般來說,你實現它的方法是簡單地添加所需的功能,以您的視圖的控制器,並設置其委託。例如,如果您希望代碼在視圖加載時運行,那麼您只需將視圖委託給控制器,然後實現awakeFromNib函數。

因此,檢測按鍵的文本視圖,請確保您的控制器是文本視圖的委託,然後實現這一點:

- (void)keyUp:(NSEvent *)theEvent 

注意,這是一種遺傳NSResponder類的方法,而不是一個NSTextView方法。你想捕捉的NSTextView關鍵事件將解決更高層次的目標 -

+1

如果將其放入委託中,則不會調用keyUp。你必須繼承NSTextView並把它放在那裏。 – 2014-03-20 23:15:18

2

它告訴我們什麼你真正想要實現是非常重要的。

例如,當有人問我如何捕獲NSText 字段中的關鍵事件時,他們真正想知道的是如何驗證字段中的輸入。這是通過將字段的格式化程序設置爲NSFormatter的實例(無論是Cocoa中包含的格式化程序還是自定義格式化程序之一)而完成的,而不是通過直接處理鍵擊。

那麼給出這個例子,你真正想要完成什麼?

1

我已經做了一些艱苦的挖掘工作,我確實找到了自己的問題的答案。我會在下面看到它,但要感謝兩位回答問題的傢伙。我認爲Stack Overflow已經是一個很棒的網站了 - 我希望更多的Mac開發人員在測試結束後能夠找到自己的方式 - 這對於其他開發人員來說是一個很好的資源,可以幫助他們轉向平臺。

所以,我所做的,由丹尼的建議,找到我的代表團的答案。我從Danny的文章中不能理解的是,委託對象中有一組啓用委託的方法,並且委託必須實現所述事件。所以對於一個TextView,我能夠找到方法textDidChange,它完成了我想要的方式,而不僅僅是捕獲按鍵所能做到的。所以,如果我在我的控制器中執行此操作:

- (void)textDidChange:(NSNotification *)aNotification; 

我可以對正在編輯的文本做出響應。當然,還有其他方法可用,我很高興與他們一起玩,因爲我知道我會像我一樣學習很多東西。再次感謝,夥計們。

10

只是爲了語法高亮小費:

不要突出整個文本視圖一次 - 這是非常慢。另外,不要使用-editedRange高亮顯示最近編輯的文本 - 如果用戶將大量文本粘貼到文本視圖中,速度也會非常慢。

相反,你需要突出其這樣做的可見文本:您高亮代碼

NSRect visibleRect = [[[textView enclosingScrollView] contentView] documentVisibleRect]; 
NSRange visibleRange = [[textView layoutManager] glyphRangeForBoundingRect:visibleRect inTextContainer:[textView textContainer]]; 

然後你喂visibleRange。

相關問題