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