Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 神秘的第一反应者变化_Objective C_Macos_Cocoa_First Responder - Fatal编程技术网

Objective c 神秘的第一反应者变化

Objective c 神秘的第一反应者变化,objective-c,macos,cocoa,first-responder,Objective C,Macos,Cocoa,First Responder,我目前正在处理一个首选项窗格。我希望自定义NSView子类在启动我的首选项窗格时具有第一响应者状态。我将我的视图设置为第一响应者(在我的NSPreferencePane子类中): 此后,我会定期检查当前的第一响应程序,似乎在didSelect完成后不久,第一响应程序会更改为我的NSPreferencePane的主视图。我的程序中没有任何内容导致此更改。以下是输出: Before: <NSTextView: 0x60000013dce0> //presumably the System

我目前正在处理一个首选项窗格。我希望自定义NSView子类在启动我的首选项窗格时具有第一响应者状态。我将我的视图设置为第一响应者(在我的NSPreferencePane子类中):

此后,我会定期检查当前的第一响应程序,似乎在didSelect完成后不久,第一响应程序会更改为我的NSPreferencePane的主视图。我的程序中没有任何内容导致此更改。以下是输出:

Before: <NSTextView: 0x60000013dce0>
//presumably the System Preferences search field.
After: <AMKeyboardView: 0x608000321a40>
//successfully set to the desired AMKeyboardView.
<NSView: 0x61000013ea00>
//<--- magic change to mainView, for seemingly no reason.
之前:
//可能是系统首选项搜索字段。
之后:
//已成功设置为所需的AMKeyboardView。

// 在查看了源代码之后,我找到了一种方法,通过这种方法,当首选项窗格打开时,他们可以将自己的搜索框设置为第一响应者。我通过添加到我的
didSelect
方法,将此方法应用于我自己的pref窗格:

[self.mainView.window performSelector:@selector(makeFirstResponder:)
                           withObject:self.keyboardView
                           afterDelay:0.0];
…而且很有效!但是,我不知道它为什么会起作用。我假设0.0延迟实际上不是即时的,这使得这个performSelector在神秘的第一响应者更改发生后运行


我想这回答了我的问题,但引出了一个新问题:为什么这样做?

以及为什么您希望
UIView
成为第一响应者?它是接受键盘输入的
NSView
子类。(implements keyDown)噢,OSX territory,帮不了你。你能在你的主视图中实现
成为第一响应者
,并设置一个断点来查看它被调用的原因吗?这是来自那个神秘调用的堆栈跟踪,我不会对这样的事情做太多调查。如果说我在多年的Mac编程中学到了一件事,那就是苹果所做的事情总是不可预测的。谢谢你,你帮了我很多忙@IvanKramarchuk哈哈,这些年来,很高兴这能有所帮助。我建议您增加
0.0
以喜欢
0.01
或其他什么,因为
0.0
可能会导致不太可靠的行为
[self.mainView.window performSelector:@selector(makeFirstResponder:)
                           withObject:self.keyboardView
                           afterDelay:0.0];