2013-02-22 29 views
0

在Objective-C,我可以让我的NSTextField的子类,符合的NSTextViewDelegate协议 - 像这样:MONOMAC/Xamarin.Mac - 衍生的NSTextField使用NSTextViewDelegate

@interface PasswordField : NSTextField <NSTextViewDelegate> 

如何翻译这个成语C#/monomac?

我试图继承NSTextViewDelegate:

private class TextViewDelegate : NSTextViewDelegate 
{} 

和分配,为我的NSTextField子类的委托财产:

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中的工作?

回答

1

有两种方法可以做到这一点:如果你是罚款保留委托独立

,你可以这样做:

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; 
    } 
} 
+0

是的,我在我的问题中说过。在Objective-C中,子类NSTextField可能符合NSTextViewDelegate协议。我想知道如何在C#/ MonoMac中重新创建这个成语。 – TheNextman 2013-02-22 15:56:24

+0

如果你真的想这样做,将它分配给.WeakDelegate而不是.Delegate,但我建议不要这样做。您必须将[Export(...)]属性应用于委托方法。 – Curtis 2013-02-22 19:33:29

+0

我已更正答案 – Curtis 2013-02-22 20:11:03