我正在使用Xamarin.iOS(仅限代码,没有故事板)开发iOS应用程序,我想知道当我从navigationcontroller弹出时,将数据发送回原始uiviewcontroller的最佳方法是什么。
在android中我使用StartActivityForResult然后覆盖OnResult,但我找不到类似的iOS方式。
我知道ViewDidLoad,ViewDidAppear等的覆盖,我正在寻找的是某种ViewDidGetPoppedBackTo(希望你得到它)。
还是有另一种更好的方法来实现这个目标吗?
答案 0 :(得分:2)
NavigationController
将所有ViewControllers跟踪为数组:NavigationController.ViewControllers
您可以通过以下代码从此数组中获取ViewController
类型的现有实例:
(如果有的话,可以在BaseViewController
中编写此方法。)
public T InstanceFromNavigationStack<T> () where T : UIViewController
{
return (T)NavigationController.ViewControllers.FirstOrDefault(v => v is T);
}
然后使用它:
var myVCInstance = InstanceFromNavigationStack<MyTargetViewController>();
if(myVCInstance != null)
{
//Assign a value like
myVCInstance.MyVariable = "MyValue";
//Or call a method like
myVCInstance.MethodToReloadView("MyValue")
}
//Go Back Navigation Code
//Then here write your navigation logic to go back.
这不仅有助于在Previous ViewController中传递数据,还可以在堆栈中传递任何ViewController。只需传递它的类型即可从Stack中获取实例。
注意:如果您的导航堆栈没有相同ViewController
类型的多个实例,这应该有用。
答案 1 :(得分:1)
使用这种方式
ViewController viewController = (ViewController)NavigationController.TopViewController;
viewController.SendData(myevent);
在SendData
中创建方法ToViewController
当导航返回并将数据发送到之前的ViewController时,首先调用此方法。
答案 2 :(得分:0)
我开始使用的另一个选项是EventHandler
方法。下面是一个示例,用于在父视图控制器中使用UITextField
(子视图控制器)中的选择填充UITableView
,然后关闭子项。
在父视图控制器中定义EventHandler
方法:
void LocationLookup_OnSelected(object sender, EventArgs e)
{
chosenLocation = (MKPlacemark)sender;
planLocation.Text = chosenLocation.Name;
this.ParentViewController.DismissViewController(true, null);
}
将EventHandler
方法从父级传递为子级的属性。
public partial class LocationLookupViewController : UITableViewController
{
private event EventHandler OnSelected;
public LocationLookupViewController(EventHandler OnSelected)
{
this.OnSelected = OnSelected;
}
...
}
调用EventHandler
传递父母所需的对象/数据
public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
{
...
OnSelected(response?.MapItems[0].Placemark, new EventArgs());
}
注意 - 上述类和函数不完整,但应该让您了解此技术的工作原理。