monomac/Xamarin.Mac-使用NSTextViewDelegate派生的NSTextField
在objective-C中,我可以使我的NSTextField子类符合NSTextViewDelegate协议-如下所示: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
@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;
}
}