monomac/Xamarin.Mac — полученный NSTextField с использованием NSTextViewDelegate

В Objective-C я могу заставить свой подкласс NSTextField соответствовать протоколу NSTextViewDelegate, например:

@interface PasswordField : NSTextField <NSTextViewDelegate>

Как я могу перевести эту идиому на С#/мономак?

Я попытался создать подкласс NSTextViewDelegate:

private class TextViewDelegate : NSTextViewDelegate
{}

И присвоив это свойству делегата моего подкласса NSTextField:

public class PasswordField : NSTextField
{
    public PasswordField(NSCoder coder) : base(coder)
    {
        this.Delegate = new TextViewDelegate();
    }
}

Однако очевидно, что это не работает, поскольку свойство Delegate элемента NSTextField (правильно) имеет тип NSTextFieldDelegate.

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

Итак, как заставить это работать так же, как в Objective-C?


person TheNextman    schedule 22.02.2013    source источник


Ответы (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;
    }
}
person Curtis    schedule 22.02.2013
comment
Да, я указал это в своем вопросе. В Objective-C подкласс NSTextField может соответствовать протоколу NSTextViewDelegate. Я хочу знать, как воссоздать эту идиому в C#/MonoMac. - person TheNextman; 22.02.2013
comment
Если вы действительно хотите это сделать, назначьте его .WeakDelegate вместо .Delegate, хотя я не рекомендую этого делать. Вам нужно будет применить атрибут [Export(...)] к вашим методам делегата. - person Curtis; 22.02.2013
comment
Спасибо, я не знал о свойстве WeakDelegate. Я попробую это на следующей неделе и дам вам знать, как это работает. - person TheNextman; 23.02.2013
comment
Работает отлично. Спасибо еще раз. - person TheNextman; 25.02.2013