2012-05-28 87 views
1

我在我的Cocoa應用程序中有一個表單,其中包含我想通過鍵盤控制的NSSegmentedControl。 NSSegmentedControl似乎很不願意成爲第一響應者,但是。使用鍵盤控制NSSegmentedControl

將窗口的初始第一響應者設置爲分段控件什麼也不做 - 當窗口第一次加載時它不會有鍵盤焦點。它接收焦點,如果我手動設置的第一個響應者這樣的,但是:

[segmentedControl.window makeFirstResponder: segmentedControl];

這將正常工作,如果表格的唯一部分是分段控制。如果我添加另一個字段(比如NSTextField),並將分段控件的nextResponder設置爲該字段,則分段控件將永遠不會成爲第一個響應者。焦點將立即轉到文本字段,然後按Tab鍵切換回分段控件不起作用。

我試過繼承NSSegmentedControl並覆蓋acceptFirstResponder,becomeFirstResponder等無濟於事。唯一有所作爲的是resignFirstResponder - 如果我從該方法返回NO,則分段控件確實會保持焦點,但顯然我不希望它始終保持焦點。

關於如何讓控件的行爲像一個正常的響應者的任何想法?

回答

0

它的行爲符合預期。並非所有控件都參與「關鍵視圖循環」。全鍵盤導航通過系統偏好設置中的通用訪問開啓,適用於所有應用程序,並不適用於各個應用程序自行實施。

最好不要在用於大量鍵盤輸入的表單中使用分段控件。 NSPopUpButton更貼近我們在網絡表單中的所有行爲,因此它不一定就是您的應用界面中的錯誤選項。

而不是完全回答你問的問題(別人可以做的),我虛心地建議你選擇功能的一面,代價是一個稍微漂亮的UI元素,因爲更漂亮的UI元素不打算得到隨着鍵盤。

+0

在這種情況下,它的可用性和效率更少。在沒有詳細討論我的特定用例的情況下,情況涉及通常通過鍵盤快捷方式召喚的彈出窗口內的非常小的窗體,因此用戶通過箭頭鍵選擇選項比鼠標。此外,從我的簡短測試中,NSPopUpButton似乎在保留第一響應者狀態方面遇到與NSSegmentedControl相同的問題。感謝您的意見,但我非常感謝。 – jlong64

+0

這是*方式*遲到,但因爲我剛剛收到這個答案的最高票數,這讓我意識到我錯過了你的評論。我沒有提供解決方案,所以我會提出一個簡單的解決方案:您的popover的viewController.view可以處理鍵盤事件(攔截並響應moveLeft和moveRight NSResponder事件)並通過其控制器更新分段控件。請記得在彈出窗口顯示時使此視圖成爲第一響應者。 –