当我切换视图时,为什么acceptFirstResponder会被调用两次?

时间:2012-01-06 01:56:08

标签: cocoa nsview

我在一个窗口中有三个视图。其中一个是我自定义的视图,它绘制了一些东西,这个视图是这个窗口的firstResponder

当我构建并运行此应用程序或切换回此视图时,acceptsFirstResponder方法会被调用两次,这让我感到困惑。为什么这个方法被称为额外的时间?有什么想法吗?

1 个答案:

答案 0 :(得分: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];
    }
}

该代码调用[view accepFirstResponder]两次。您还可以想象在一个函数中检查的值,并根据结果将视图传递给另一个函数,该函数也会再次检查,也许是因为它可以通过多个代码路径输入,而且最直接的是写入它