monomac/Xamarin.Mac-使用NSTextViewDelegate派生的NSTextField

monomac/Xamarin.Mac-使用NSTextViewDelegate派生的NSTextField,mono,monomac,xamarin,xamarin.mac,Mono,Monomac,Xamarin,Xamarin.mac,在objective-C中,我可以使我的NSTextField子类符合NSTextViewDelegate协议-如下所示: @interface PasswordField : NSTextField <NSTextViewDelegate> 并将其分配给我的NSTextField子类的delegate属性: public class PasswordField : NSTextField { public PasswordField(NSCoder coder) : ba

在objective-C中,我可以使我的NSTextField子类符合NSTextViewDelegate协议-如下所示:

@interface PasswordField : NSTextField <NSTextViewDelegate>
并将其分配给我的NSTextField子类的delegate属性:

public class PasswordField : NSTextField
{
    public PasswordField(NSCoder coder) : base(coder)
    {
        this.Delegate = new TextViewDelegate();
    }
}
但是,这显然不起作用,因为NSTextField的委托属性(正确)键入为NSTextFieldDelegate

Error CS0029: Cannot implicitly convert type `PasswordFieldControl.PasswordField.TextViewDelegate' to `MonoMac.AppKit.NSTextFieldDelegate' (CS0029)

那么,如何像在objective-C中那样实现这一点呢?

有两种方法:

如果可以将代理分开,可以执行以下操作:

class TextViewDelegate : NSTextViewDelegate
{
    public override void TextDidChange (NSNotification notification)
    {
    }
}

public class PasswordField : NSTextField
{
    public PasswordField(NSCoder coder) : base(coder)
    {
        this.WeakDelegate = new TextViewDelegate();
    }
}
或者,如果要使用相同的PasswordField对象:

public class PasswordField : NSTextField
{
    [Export("textDidChange:")]
    public void TextDidChange (NSNotification notification)
    {
    }

    public PasswordField(NSCoder coder) : base(coder)
    {
        this.WeakDelegate = this;
    }
}

是的,我在我的问题中说过。在Objective-C中,子类NSTextField可能符合NSTextViewDelegate协议。我想知道如何在C#/MonoMac中重新创建该习惯用法。如果确实要这样做,请将其指定给.WeakDelegate而不是.Delegate,尽管我建议不要这样做。您必须对委托方法应用[Export(…)]属性。谢谢,我不知道WeakDelegate属性。我将在下周尝试一下,让你知道它是如何工作的。效果很好。再次感谢。
public class PasswordField : NSTextField
{
    [Export("textDidChange:")]
    public void TextDidChange (NSNotification notification)
    {
    }

    public PasswordField(NSCoder coder) : base(coder)
    {
        this.WeakDelegate = this;
    }
}