0

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

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

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

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

public partial class ViewController : UIViewController

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

public partial class ViewController : UIViewController, SomeDelegate

我可以delegate在一些额外的类上实现它:

public ViewControllerDelegate : SomeDelegate

并将此类用作代表,但这对我来说并不是很方便。

我最近发现通过添加“I”:

public partial class ViewController : UIViewController, ISomeDelegate

我通过(我假设)明确说编译器这是接口(协议)而不是基类来避免出现“多个基类错误”。

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

有没有办法delegates在某些类中实现UIViewController(无论如何)?

4

1 回答 1

2

在 Xamarin 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");
    }
}
于 2017-07-30T10:48:47.657 回答