【问题标题】:alertDidEnd: What is the Mono equivalent of Objective-C's void*?alertDidEnd:Objective-C 的 void* 的 Mono 等价物是什么?
【发布时间】:2012-05-04 22:42:53
【问题描述】:

我正在尝试实现一个基于 Cocoa 的方法

- (void) alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;

问题在于 void* 类型的参数。我不知道指向 void 的 C# 等价物是什么。

我尝试使用“void*”进行不安全的执行,但显然不一样。我也尝试过简单的“void”,但 C# 编译器声称 void 不能用作参数类型。

有什么想法吗?

Error CS0123: A method or delegate `MyProgram.MainWindow.alertDidEnd(MonoMac.AppKit.NSAlert, int, MonoMac.Foundation.NSObject)' parameters do not match delegate `MonoMac.Foundation.NSAction()' parameters (CS0123)

更新(问题解决后):

这些是完成这项工作的调用和方法:

alert.BeginSheet ((NSWindow)sender, this, new Selector ("alertDidEnd:returnCode:contextInfo:"), IntPtr.Zero);


[Export("alertDidEnd:returnCode:contextInfo:")]
public void alertDidEnd (NSAlert alert, int result, IntPtr ci)
{}

第一个是显示附加到窗口的警报,第二个是解除警报时调用的函数的方法声明。结果存储在 int result 中。

【问题讨论】:

    标签: c# monomac nsalert


    【解决方案1】:

    void* 映射到 .net 中的 IntPtr:

    [Export("alertDidEnd:returnCode:contextInfo:")] 
    public void alertDidEnd (NSAlert alert, int returnCode, IntPtr contextInfo) 
    { 
        Console.WriteLine (returnCode); 
    }
    

    您可以在这里查看一个工作示例:

    https://github.com/picoe/Eto/blob/master/Source/Eto.Platform.Mac/Forms/MacModal.cs

    此外,从您的错误消息看来,您应该只使用普通的无参数方法来处理您正在使用的任何方法。 NSAction 是一个没有参数的委托。

    【讨论】:

    • Ta,我会试试看。 (如果我使用无参数方法,我将不知道在消息框中按下了哪个按钮。)
    • 如果您发布您实际尝试做的事情可能会有所帮助,因为您似乎没有正确使用 NSAlert.. 例如如果你检查 myAlert.RunModal() 的返回值,它也会给你返回码。
    • 我认为 RunModal() 是 beginSheetModalForWindow() 的替代方法。我不认为我应该给他们两个打电话。
    • 它是,虽然你没有提到你正在使用 BeginSheetModalForWindow(),或者提供任何关于你如何调用它的代码 - 它可能有助于识别问题..
    • 在所有 Cocoa 教程中,我发现 Begin...() 方法总是在还需要 AlertDidEnd() 方法时使用。我以为他们是在一起的。
    【解决方案2】:

    您可以将方法定义为:

    [Export("alertDidEnd:returnCode:contextInfo:")] 
    public void alertDidEnd (NSAlert alert, int returnCode, NSObject contextInfo) 
    { 
        Console.WriteLine (returnCode); 
    }
    

    void * 指针将被包装到一个 NSObject 中。

    【讨论】:

    • 这对我不起作用。请参阅编辑成问题的错误消息。
    猜你喜欢
    • 2014-05-08
    • 2011-01-19
    • 2010-12-07
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多