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