【问题标题】:Xamarin ios delegationXamarin ios 委托
【发布时间】:2016-04-18 15:51:09
【问题描述】:

在 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

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

public partial class ViewController : UIViewController, SomeDelegate

我可以在一些额外的类上实现这个delegate

public ViewControllerDelegate : SomeDelegate

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

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

public partial class ViewController : UIViewController, ISomeDelegate

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

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

有没有办法在UIViewController(随便)等一些类中实现delegates

【问题讨论】:

  • 我需要这样的东西stackoverflow.com/questions/21821003/… 但它不起作用
  • 确保 ISomeDelegate 是一个接口。然后看起来你可能有某种命名空间冲突,其中 SameDelagate 在不同的命名空间中定义,因此不兼容
  • 绑定项目会将接口前缀“I”添加到任何具有属性 [Model, Protocol] 的接口。问题是您不能在绑定库中定义任何 ISomeDelegate 类型的属性。您确定定义该方法的类中没有 WeakDelegate/Delegate 属性吗?这是您自己的图书馆还是第 3 方?可以发一下标题吗?

标签: xamarin.ios objective-sharpie xamarin.ios-binding


【解决方案1】:

在 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");
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-09
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2012-02-03
    • 2019-05-02
    相关资源
    最近更新 更多