2012-01-06 111 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]两次。你也可以想象在一个函数中被检查的值,并根据结果将视图传递给另一个函数,该函数也会再次检查,可能是因为它可以通过多个代码路径输入,而且最直接的方法是编写它。

相关问题