Xamarin.ios 沙马林代表团

Xamarin.ios 沙马林代表团,xamarin.ios,objective-sharpie,xamarin.ios-binding,Xamarin.ios,Objective Sharpie,Xamarin.ios Binding,在Xamarin中使用委托模式的正确方法是什么 在API定义(由sharpie生成)中,我将协议映射到接口SomeDelegate: // @protocol SomeDelegate <NSObject> [Protocol, Model] [BaseType (typeof(NSObject))] interface SomeDelegate { // @required -(void)someMethod; [Ab

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

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

// @protocol SomeDelegate <NSObject>
    [Protocol, Model]
    [BaseType (typeof(NSObject))]
    interface SomeDelegate
    {
        // @required -(void)someMethod;
        [Abstract]
        [Export ("someMethod")]
        void SomeMethod;
        ...
但我不能让视图控制器实现这样的协议:(不能有多个基类)

我可以在一些额外的类上实现此
委托

public ViewControllerDelegate : SomeDelegate
并将这个类用作委托,但这对我来说并不方便

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

通过(我假设)明确地告诉编译器这是接口(协议)而不是基类,我避免了“多个基类错误”

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


是否有一种方法可以在某些类中实现
委托
,例如
UIViewController
(无论什么)?

在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();
    }
}
公共部分类SuggesterTableViewController:BaseSugsterTableViewController{
公共福利参考工作指南;
公共SuggesterTableViewController(IntPtr句柄):基本(句柄){
}
公共样本委托工作删除{
得到{
抽样代表工作人员;
返回_workerDelegate.TryGetTarget(out workerDelegate)?workerDelegate:null;
}
设置{
_workerDelegate=新WeakReference(值);
}
}
public override void RowSelected(UITableView tableView,NSIndexPath indexPath){
如果(_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");
    }
}
public分部类SomeViewController:UIViewController,sampleDelegate{
public void openSuggestorView(){
SuggesterTableViewController SuggesterVC=(SuggesterTableViewController)this.Storyboard.InstanceDeviceController(“SuggesterTableVC”);
suggestVC.\u workerDelegate=新的WeakReference(本);
}
public void GetSelectedItem(){
Console.WriteLine(“调用回调”);
}
}

在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();
    }
}
公共部分类SuggesterTableViewController:BaseSugsterTableViewController{
公共福利参考工作指南;
公共SuggesterTableViewController(IntPtr句柄):基本(句柄){
}
公共样本委托工作删除{
得到{
抽样代表工作人员;
返回_workerDelegate.TryGetTarget(out workerDelegate)?workerDelegate:null;
}
设置{
_workerDelegate=新WeakReference(值);
}
}
public override void RowSelected(UITableView tableView,NSIndexPath indexPath){
如果(_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");
    }
}
public分部类SomeViewController:UIViewController,sampleDelegate{
public void openSuggestorView(){
SuggesterTableViewController SuggesterVC=(SuggesterTableViewController)this.Storyboard.InstanceDeviceController(“SuggesterTableVC”);
suggestVC.\u workerDelegate=新的WeakReference(本);
}
public void GetSelectedItem(){
Console.WriteLine(“调用回调”);
}
}

我需要这样的东西,但它不起作用。请确保ISomeDelegate是一个接口。然后,您可能会遇到某种名称空间冲突,其中SameDelagate在不同的名称空间中定义,因此不兼容。绑定项目将向任何具有属性[模型、协议]的接口添加接口前缀“I”。问题是您不能在绑定库中定义任何类型为ISomeDelegate的属性。您确定定义方法的类中没有WeakDelegate/Delegate属性吗?这是您自己的图书馆还是第三方?你能发布标题吗?我需要这样的东西,但它不起作用。请确保ISomeDelegate是一个接口。然后,您可能会遇到某种名称空间冲突,其中SameDelagate在不同的名称空间中定义,因此不兼容。绑定项目将向任何具有属性[模型、协议]的接口添加接口前缀“I”。问题是您不能在绑定库中定义任何类型为ISomeDelegate的属性。您确定定义方法的类中没有WeakDelegate/Delegate属性吗?这是您自己的图书馆还是第三方?你能把标题贴上去吗?