Xamarin.ios 沙马林代表团
在Xamarin中使用委托模式的正确方法是什么 在API定义(由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
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属性吗?这是您自己的图书馆还是第三方?你能把标题贴上去吗?