Events
我设法使事件方法正常工作。我的信息基于以下链接:
- PresentViewController 并传回数据 http://forums.xamarin.com/discussion/22543/presentviewcontroller-and-pass-data-back
- 主控制器和从控制器之间的通信 http://developer.xamarin.com/recipes/ios/content_controls/split_view/communicate_between_master_and_detail_controllers/
- Xamarin iOS 中更好的 UITableViewSource http://www.mourfield.com/2013/09/better-uitableviewsource-xamarin-ios/
- 使用 Monotouch 处理 iOS 的 UITableViewSource 事件 https://stackoverflow.com/questions/13715905/event-handling-uitableviewsource-for-ios-with-monotouch
In my UITableViewController
(视图控制器 B)我添加了以下内容:
// class variable
public event EventHandler<BLevelSelectedEventArgs> BLevelSelected;
// event handler
public class BLevelSelectedEventArgs : EventArgs
{
public BLevelItem bLevel { get; set; }
public BLevelSelectedEventArgs(BLevelItem bLevel) : base()
{
this.bLevel = bLevel;
}
}
这里定义了事件以及自定义事件处理程序。您可以定义要通过事件传输数据的属性,例如细绳。这里有一个定制BLevelItem
用来。应根据您的应用程序更改事件处理程序的名称和事件的名称。在这个UITableViewController
类我也有UITableViewSource
定义的。
public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
{
tableView.DeselectRow (indexPath, true); // iOS convention is to remove the highlight
if (this.controller.BLevelSelected != null) {
this.controller.BLevelSelected (this, new BLevelSelectedEventArgs (controller.bLevelList[indexPath.Row]));
}
}
这里引发事件并且参数随事件一起传递。现在只缺少一个对事件做出反应的侦听器。这在视图控制器 A 上继续:
bLevelController.BLevelSelected += (object sender, BLevelController.BLevelSelectedEventArgs e) => {
System.Diagnostics.Debug.WriteLine(e.bLevel.bLevelName);
};
bLevelController
是我的视图控制器 B 的一个实例。您可以访问定义的事件,如上所示,但您必须注意您使用类名(BLevelController
)来访问BLevelSelectedEventArgs
.
如果您还可以添加其他可能性来在视图控制器之间传递数据(通知中心、协议/代表……),那就太好了。
Delegate
使用一种委托方法第 5 部分 - 在 iOS 设计器中使用表格 http://developer.xamarin.com/guides/ios/user_interface/tables/part_5_-_creating_Tables_in_a_Storyboard/。你定义一个Delegate在你的UITableViewController
:
public MasterViewController Delegate {get;set;} // will be used to Save, Delete later
当你实例化详细视图控制器 in the 主视图控制器你设置了Delegate财产。例子:
public override void PrepareForSegue (UIStoryboardSegue segue, NSObject sender)
{
base.PrepareForSegue (segue, sender);
var detailViewController = segue.DestinationViewController as DetailViewController;
if (detailViewController != null) {
detailViewController.Delegate = this;
}
}
In the 详细视图控制器你可以调用任何方法主视图控制器:
public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
{
tableView.DeselectRow (indexPath, true); // iOS convention is to remove the highlight
if (this.controller.Delegate != null) {
this.controller.Delegate.SetItems (this.controller.items[indexPath.Row]);
}
}
// a method in MasterViewController
public void SetItems(string items){
this.items = items;
this.NavigationController.PopViewControllerAnimated (true);
// do something here
}
这有效,因为我通过了详细视图控制器 to the 详情查看来源:
// in ViewDidLoad of DetailViewController
this.TableView.Source = new DetailViewSource (this);
// in the constructor of DetailViewSource
private CostCentreController controller;
public CostCentreListSource (CostCentreController controller)
{
this.controller = controller;
}
NS通知中心
我的信息基于xamarin/monotouch-样本 https://github.com/xamarin/monotouch-samples/blob/master/AppPrefs/AppDelegate.cs and Xamarin NSNotificatioCenter:如何获取正在传递的 NSObject? https://stackoverflow.com/questions/15486010/xamarin-nsnotificatiocenter-how-can-i-get-the-nsobject-being-passed.
没有数据传输的简单示例:
// class level variable
NSObject observer;
// register as observer
public override void ViewWillAppear (bool animated)
{
base.ViewWillAppear (animated);
observer = NSNotificationCenter.DefaultCenter.AddObserver ((NSString)UIDevice.OrientationDidChangeNotification, OrientationChanged);
}
// deregister as observer
public override void ViewDidDisappear (bool animated)
{
base.ViewDidDisappear (animated);
if (observer != null) {
NSNotificationCenter.DefaultCenter.RemoveObserver (observer);
observer = null;
}
}
// function which should do something when notification is received
public void OrientationChanged(NSNotification notification){
Console.WriteLine ("test");
// perhaps you can do the following as in the linked SO question: NSObject myObject = notification.Object;
}