ObjcRuntime.Selector 未处理预期的对象 (xamarin)

ObjcRuntime.Selector not working on the expected object (xamarin)

我需要响应 NSStatusBarButton 单击以显示菜单,不幸的是只有 属性 "Action" 添加单击处理程序。 "Action" 属性 需要一个选择器。

我处理点击的方法如下:

[Action("StatusBarClicked:")] public void StatusBarClicked(NSObject sender)
{
    // do something 
}

然后我执行以下操作来分配按钮操作:

statusBarButton.Action = new Selector("StatusBarClicked:");

现在,当我在应用委托的 DidFinishLaunching 方法中执行此操作并且 StatusBarClicked 方法是 AppDelegate 的一个方法时,一切正常 class。

当我将状态条码包装在单独的 class 中并在该 class 中声明方法和选择器时,它不起作用(未调用 StatusBarClicked)。 奇怪的是,如果我还在 AppDelegate 中保留 StatusBarClicked 方法,则会调用该方法:

public class SomeClass
{
    public void Test()
    {
        var statusItem = NSStatusBar
            .SystemStatusBar.CreateStatusItem(NSStatusItemLength.Square);

        var button = statusItem.Button;
        button.Image = NSImage.ImageNamed("test");
        button.Action = new Selector("StatusBarClicked:");
   }

    [Action("StatusBarClicked:")] public void StatusBarClicked(NSObject sender)
    {
        // never called
    }
}

我一定是遗漏了什么,知道吗?

设置动作时,选择器会在动作触发时发送到 NSControl 的 Target 属性。

如果目标为空,则应用程序沿着响应者链向上移动,以找到响应选择器的第一个对象。应用程序委托在响应者链中,这就是它起作用的原因。

https://developer.apple.com/documentation/appkit/nscontrol/1428885-target?language=objc

如果你想使用你的自定义 class 作为目标我认为它需要 subclass NSObject

确保 class 扩展了 NSObject 后,您可以将其添加到构造函数中:

button.Target = this;