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;
我需要响应 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;