gpt4 book ai didi

objective-c - 神秘的第一响应者变化

转载 作者:行者123 更新时间:2023-12-03 17:11:31 25 4
gpt4 key购买 nike

我目前正在开发首选项 Pane 。我希望自定义 NSView 子类在启动我的首选项 Pane 时具有第一响应者状态。我将 View 设置为第一响应者(在我的 NSPreferencePane 子类中):

- (void)didSelect {
NSLog(@"Before: %@", self.mainView.window.firstResponder);

[self.keyboardView.window makeFirstResponder:self.keyboardView];

NSLog(@"After: %@", self.mainView.window.firstResponder);
}

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

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.

在Interface Builder 中,我的窗口有一个名为initialFirstResponder 的 socket 。我无法将此导出设置为任何内容,因为我的 View 是以编程方式添加的,并且无法通过 Interface Builder 访问。我怀疑缺乏连接会导致默认行为,将第一响应者设置为 mainView。

我该如何解决此问题?

最佳答案

查看源代码后Secrets Preference Pane ,我找到了他们在打开首选项 Pane 时将自己的搜索框设置为第一响应者的方法。我通过添加到我的 didSelect 方法来将此方法应用于我自己的首选项 Pane :

[self.mainView.window performSelector:@selector(makeFirstResponder:)
withObject:self.keyboardView
afterDelay:0.0];

...并且有效!但是,我不知道为什么它有效。我假设 0.0 延迟实际上并不是真正即时的,这使得这个 PerformSelector 在神秘的第一响应者更改发生后运行。

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

关于objective-c - 神秘的第一响应者变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24903165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com