我有一個用 Swift 撰寫的可可應用程式。該應用程式有許多NSControls用戶條目。用戶可以使用 tab 鍵在控制元件之間移動,其中大多數是文本欄位。我在代碼中做所有事情,我不使用 Interface Builder。
其中一些是動態的:我有一個自定義NSControl的,我們稱之為它myRow本身托管兩個“NSTextFields”。myRow 本身托管在一個 superView 中,我們稱之為myRowManager. 當用戶輸入時,這myRow會通知myRowManager,并且另一個myRow放置在第一個下方。當用戶洗掉一個欄位的內容時,myRowManager然后將其洗掉myRow并重新排列剩余的內容myRows。整個設定模仿了一個表格視圖,其中總是比條目多一行,這樣用戶總是可以在最后添加一個條目。
修改現有條目時使用 tab 鍵效果很好。
但是我設定的性質意味著,當添加或洗掉一行時,.layoutSubviews()呼叫一個方法,所有myRows都從superView(管理器)中洗掉,然后myRows創建新的,反映新的數字和順序,這當然是反映基礎資料。
但是通過從視圖層次結構中洗掉剛剛獲得焦點的 myRow ,將視窗的初始回應者設定為key-view,因為 中的當前元素和下一個元素key-view loop不再存在。
因此,我試圖將key-view手動設定為新創建的文本欄位。為此,該layoutSubviews方法保留對此文本欄位的參考。
不幸的是,到目前為止我還沒有成功。
我現在在做什么(這是myRow添加條目時由 a 呼叫的管理器方法):
func rowAddedAtEnd(_ index: Int) {
layoutSubviews()
self.window?.recalculateKeyViewLoop()
self.window?.selectKeyView(following:targetView)
}
令我感到奇怪的是,沒有將特定視圖設定為關鍵視圖的方法。我可以使用.selectKeyView(following:)或(preceding:)
但無論如何 - 它不起作用。聚焦環只是被重置到視窗左上角的元素。
我該如何解決這個問題?
uj5u.com熱心網友回復:
從以下檔案func selectKeyView(following view: NSView):
將
nextValidKeyView訊息發送到view,如果該訊息回傳一個NSView物件,則使用回傳的物件進行呼叫makeFirstResponder(_:)。
要選擇targetView,跳過nextValidKeyView并呼叫makeFirstResponder(_:)。
self.window?.makeFirstResponder(targetView)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/509969.html
