gpt4 book ai didi

c# - 在 Xamarin.iOS 中调用方法并将数据从 View Controller B 传递到 View Controller A

转载 作者:行者123 更新时间:2023-11-29 10:38:39 24 4
gpt4 key购买 nike

我有一个 View Controller A,我可以在其中检索一些值。在某些情况下,如果有多个值可用,则用户必须选择一个值。所以我展示了另一个 View Controller B (UITableView),让用户选择条目。当我当前在 B 上时,如何从 A 调用方法? (以避免重复代码)我如何在该方法中传递一些参数?

我读到了 delegates/protocols , events (.NET style)和通知中心。传递字符串并从 A 调用方法的最佳方法是什么?你能举个例子吗?在 Xamarin 的示例中,没有关于如何定义自定义协议(protocol)的示例。

或者我应该公开 A 的字段并将该字段传递给我处理数据的 View Controller B?

最佳答案

事件

我设法使事件方法正常工作。我的信息基于以下链接:

在我的 UITableViewController( View Controller 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]));
}

}

这里事件被引发,参数随事件一起传递。现在只缺少一个对事件使用react的监听器。这在 View Controller A 上进行:

bLevelController.BLevelSelected += (object sender, BLevelController.BLevelSelectedEventArgs e) => {
System.Diagnostics.Debug.WriteLine(e.bLevel.bLevelName);
};

bLevelController 是我的 View Controller B 的一个实例。您可以访问定义的事件,如上所示,但您必须知道您使用类名 (BLevelController) 访问 BLevelSelectedEventArgs

如果您还可以添加其他可能性以在 View Controller (通知中心、协议(protocol)/代理等)之间传递数据,那就太好了。


代表

使用一种委托(delegate)方法Part 5 - Working with Tables in the iOS Designer .您在 UITableViewController 中定义了一个Delegate:

public MasterViewController Delegate {get;set;} // will be used to Save, Delete later

当您在 MasterViewController 中实例化 DetailViewController 时,您设置了 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;
}
}

DetailViewController 中,您可以调用 MasterViewController 中的任何方法:

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
}

之所以可行,是因为我将 DetailViewController 传递给了 DetailViewSource:

// 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;
}

NSNotificationCenter

我的信息基于xamarin/monotouch-samplesXamarin 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;
}

关于c# - 在 Xamarin.iOS 中调用方法并将数据从 View Controller B 传递到 View Controller A,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25661315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com