Xamarin ios 委派

Xamarin ios delegation

在 Xamarin 中使用委托模式的正确方法是什么?

在 API 定义中(由 sharpie 生成)我将协议映射到 Interface SomeDelegate:

// @protocol SomeDelegate <NSObject>
    [Protocol, Model]
    [BaseType (typeof(NSObject))]
    interface SomeDelegate
    {
        // @required -(void)someMethod;
        [Abstract]
        [Export ("someMethod")]
        void SomeMethod;
        ...

我已经这样声明了视图控制器:

public partial class ViewController : UIViewController

但是我不能让视图控制器像这样实现我的协议:(不能有多个基础 classes)

public partial class ViewController : UIViewController, SomeDelegate

我可以在一些额外的 class:

上实现这个 delegate
public ViewControllerDelegate : SomeDelegate

并使用此 class 作为委托,但这对我来说并不是很方便。

我最近发现通过添加 "I":

public partial class ViewController : UIViewController, ISomeDelegate

我通过(我假设)明确告诉编译器这是接口(协议)而不是基础来避免 "multiple base classes error" class。

现在我需要将委托作为方法的参数传递,并且出现编译错误 - 无法将 SomeDelegate 类型转换为 SomeDelegate

有没有办法在某些 class 中实现 delegates,例如 UIViewController(随便)?

在 Xamarin callback/delegate 中试试这个 iOS:

为您的方法定义接口:

public interface sampleDelegate{
    void GetSelectedItem();
}         

在您的 destinationViewController 上,声明一个 WeakReference 界面并进行调用:

public partial class SuggesterTableViewController : BaseSuggesterTableViewController{
    public WeakReference <sampleDelegate> _workerDelegate;
    public SuggesterTableViewController(IntPtr handle) : base(handle){
    }
    public sampleDelegate WorkerDelegate{
        get{
            sampleDelegate workerDelegate;
            return _workerDelegate.TryGetTarget(out workerDelegate) ? workerDelegate : null;
        }
        set{
            _workerDelegate = new WeakReference<sampleDelegate>(value);
        }
    }
    public override void RowSelected(UITableView tableView, NSIndexPath indexPath){
        if (_workerDelegate != null)
            WorkerDelegate?.GetSelectedItem();
    }
}

在您的 sourceViewController 上实现接口:

public partial class SomeViewController : UIViewController,sampleDelegate{
    public void openSuggestorView(){
        SuggesterTableViewController suggestVC = (SuggesterTableViewController)this.Storyboard.InstantiateViewController("SuggestTableVC");
        suggestVC._workerDelegate = new WeakReference<sampleDelegate>(this);

    }

    public void GetSelectedItem(){
        Console.WriteLine("Callback called");
    }
}