I have the following reference swift code and I'm trying to implement the same thing in xamain.mac.
class MyTableView : NSTableView {
override func cancelOperation(_ sender: Any?) {
// some custom processing goes here
super.cancelOperation(sender)
// another part of custom processing goes here
}
}
The problem is that in the C# the NSTableView does not implement cancelOperation:, so there is nothing to override.
I was able to handle the message with the direct export inside my NSTableView subclass:
[Export("cancelOperation:")]
private void CancelOperation(NSObject? sender)
{
// some custom processing
System.Diagnostics.Debug.WriteLine("Custom processing");
//won't compile
//base.CancelOperation(sender);
//crashes the app
objc_msgSendSuper(this.SuperHandle, Selector.GetHandle("cancelOperation:"),
sender?.Handle ?? NativeHandle.Zero);
//another part of custom processing
System.Diagnostics.Debug.WriteLine("another part of custom processing");
}
[DllImport ("/usr/lib/libobjc.dylib", EntryPoint = "objc_msgSend")]
private static extern void objc_msgSendSuper(NativeHandle superReceiver,
NativeHandle selector,
NativeHandle value);
And then the problem is that I can't call base/super implementation as a Swift code does. I can't just write base.CancelOperation(sender) because of this is not an overridden member, but a direct export.
As a workaround I tried to use objc_msgSendSuper, but this crashes the application (most likely because I'm doing it wrong).
So, the question is - how to implement the custom handler for the cancelOperation: (or other member of informal protocol) and call the base/super implementation from such a handler.
Test project which demonstrates the problem may be downloaded here. Just enter something into the second column of the table then press Esc. This will cause a crash due to the objc_msgSendSuper inside the MyNSTableView.CancelOperation handler.
I finally got it to work. The approach from the question was correct, and the problem was in the stupid mistake in the
objc_msgSendSuperdeclaration - the functinon name is correct, butEntryPointis wrong! The correctEntryPointisobjc_msgSendSuper.So after replacing declaration with the following all works as expected: