0
我在一個窗口中有三個視圖。其中之一是我定製的視圖,以便繪製某些內容,並且此視圖爲此窗口的firstResponder
。爲什麼acceptFirstResponder在切換視圖時會被調用兩次?
當我構建並運行此應用程序或切換回此視圖時,acceptsFirstResponder
方法被調用兩次,這使我感到困惑。爲什麼該方法被稱爲額外的時間?有任何想法嗎?
我在一個窗口中有三個視圖。其中之一是我定製的視圖,以便繪製某些內容,並且此視圖爲此窗口的firstResponder
。爲什麼acceptFirstResponder在切換視圖時會被調用兩次?
當我構建並運行此應用程序或切換回此視圖時,acceptsFirstResponder
方法被調用兩次,這使我感到困惑。爲什麼該方法被稱爲額外的時間?有任何想法嗎?
這是AppKit用來了解您的視圖如何工作的回調。你不應該根據這種方法被調用的頻率或頻率做出任何決定。
如果你真的好奇它爲什麼被多次調用,你可以通過在方法中放置一個斷點來猜測。當命中斷點時,查看回溯以查看堆棧中更高級別的AppKit方法的名稱。
例如,設想在了AppKit像這樣的代碼誠然人爲的例子:
- (void)_syncFirstResponderStatusOfView:(NSView *)view withWindow:(NSWindow *)window {
if ((view == [window firstResponder]) && ![view acceptsFirstResponder]) {
// Perhaps the view changed its mind about accepting first responder
[window _makeFirstResponder:nil];
} else if ((view != [window firstResponder]) && [view acceptsFirstResponder]) {
[window _makeFirstResponder:view];
}
}
即代碼調用[視圖acceptsFirstResponder]兩次。你也可以想象在一個函數中被檢查的值,並根據結果將視圖傳遞給另一個函數,該函數也會再次檢查,可能是因爲它可以通過多個代碼路徑輸入,而且最直接的方法是編寫它。
你爲什麼在意?你在做什麼'acceptFirstResponder'方法? – 2012-01-06 02:05:19
沒有任何理由,我只想知道里面的細節。如果我在這個方法中添加了一些東西,將會運行兩次。這可能是可怕的。 – 2012-01-06 02:58:23
你應該在該方法中做的唯一事情是返回YES或NO。您可能需要重寫'becomeFirstResponder'然而,它是否被多次調用? – 2012-01-06 03:09:44