我在一个窗口中有三个视图。其中一个是我自定义的视图,它绘制了一些东西,这个视图是这个窗口的firstResponder
。
当我构建并运行此应用程序或切换回此视图时,acceptsFirstResponder
方法会被调用两次,这让我感到困惑。为什么这个方法被称为额外的时间?有什么想法吗?
答案 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]两次。您还可以想象在一个函数中检查的值,并根据结果将视图传递给另一个函数,该函数也会再次检查,也许是因为它可以通过多个代码路径输入,而且最直接的是写入它