2012-01-06 149 views
0

我在一個窗口中有三個視圖。其中之一是我定製的視圖,以便繪製某些內容,並且此視圖爲此窗口的firstResponder爲什麼acceptFirstResponder在切換視圖時會被調用兩次?

當我構建並運行此應用程序或切換回此視圖時,acceptsFirstResponder方法被調用兩次,這使我感到困惑。爲什麼該方法被稱爲額外的時間?有任何想法嗎?

+0

你爲什麼在意?你在做什麼'acceptFirstResponder'方法? – 2012-01-06 02:05:19

+0

沒有任何理由,我只想知道里面的細節。如果我在這個方法中添加了一些東西,將會運行兩次。這可能是可怕的。 – 2012-01-06 02:58:23

+0

你應該在該方法中做的唯一事情是返回YES或NO。您可能需要重寫'becomeFirstResponder'然而,它是否被多次調用? – 2012-01-06 03:09:44

回答

3

這是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]兩次。你也可以想象在一個函數中被檢查的值,並根據結果將視圖傳遞給另一個函數,該函數也會再次檢查,可能是因爲它可以通過多個代碼路徑輸入,而且最直接的方法是編寫它。

相關問題