NSButton不会触发事件
我有一个在Mac上运行的.NET Xamarin应用。一直运行正常,但我一直在把它升级到.NET 10和 macOS 26。
升级之后,出现一个对话框表现异常。它是用来创建新账号,或连接到一个现有账号的弹出框,使用一个标签页在两者之间切换。
我在下面放了一张对话框的图片(请忽略Test、Blah和 Blah2按钮,它们是为了在不同位置/视图测试响应者链而设置的)。
问题在于NSTextFields可以正常工作(你可以点击并在其中输入,事件会发送给我的应用),但NSButtons不会。NSButtons不会向我的应用发送任何事件——点击它们没有任何反应,甚至连按住的视觉反馈都没有,尽管它们看起来是启用状态。所有这些按钮都不会发送事件。
我可以确认的事项列表:
- 按钮是启用状态 - 我用调试器检查过,也在ViewDidLoad中设置了enabled,并在故事板中再次确认。
From within the debugger:
> createButton.Enabled
true
* 响应者链是正确的 - 我从实际运行的应用中导出并检查。对于 “Create” 按钮,它的链路是 - NSButton -> NSView -> ViewController
* 我还测试了其他按钮类型:常规推按钮 [Style: Push, Type: Momentary push in] 和复选框 [Type: Switch] 都不会发送事件
* 按钮没有被子类化 - 它们只是普通的NSButtons。
* 没有重叠的视图在吞掉事件(通过检查视图层级和响应者链确认)。
* 我在主视图(上方的blah)和标签视图(Test、Blah2)中放置了新按钮和文本字段。文本字段工作正常。按钮不发送事件。
* 我已经删除并重新创建了故事板中的outlets和 actions。
* 我在故事板中添加了一个按钮 - "blah" - 并通过.Activated编程连接。这也不起作用。
* 我又在程序中添加了一个按钮 - "test" - 并通过.Activated编程连接。这也不起作用。
* 我已经把Enter键绑定到文本字段以执行创建/连接。这是可行的,因为文本字段确实发送事件。
* 文本字段的 "pass" 和 "confirm pass" 发送changed事件,在不匹配时会禁用创建按钮。这是可行的,你可以看到按钮禁用/启用。
下面是“Create”按钮的响应者链转储。看起来是正确的:
*****Responder chain****
Responder: NSButton <NSButton: 0x858cba080>
Responder: NSView <NSView: 0x858cb8c80>
Responder: NSKVONotifying_SetupAccountVC <SetupAccountVC: 0x85c265900>
Responder: NSWindow <NSWindow: 0x858cbb200>
*****Responder chain finished
我通过以下代码加载创建账户的界面:
if (accountExists)
{
PerformSegue("loginSegue", this);
}
else
{
PerformSegue("setupAccountSegue", this);
}
跳转类型是 "Sheet"。
有没有人对为什么NSButton事件没有被发送还有其他想法?
我已经在故事板中删除并从头创建SetupAccountVC。NSViewController + View,里面有NSTabView(加上两个标签和控件)以及底部的退出和连接按钮。结果相同。我已经禁用了所有的 "ViewDidLoad" 代码(加载一些图片来表示良好/坏的密码、密码不匹配的警告、textFieldChanged处理程序)。仍然无效。
我尝试了其他跳转类型:
- sheet(它现在使用的)。同样的问题。
- popover。同样的问题。
- Show。同样的问题。
- Modal。同样的问题。
解决方案
上面看到的对话框是NSTabViewController的子类,按钮不会发送事件。变通做法是:创建一个NSViewController,在其中使用NSTabView来创建你的标签页。按钮和事件就可以工作。
我其实之前也做过这个,但我把视图控制器设置成NSTabViewController的子类,而不是ViewController——这是我的错误。
我觉得NSTabViewController和按钮之间可能确实存在一些“怪异”的地方。
