将数据传递回pop上的uiviewcontroller(NavigationController.PopViewController)

时间:2017-11-21 07:42:09

标签: ios xamarin uiviewcontroller xamarin.ios

我正在使用Xamarin.iOS(仅限代码,没有故事板)开发iOS应用程序,我想知道当我从navigationcontroller弹出时,将数据发送回原始uiviewcontroller的最佳方法是什么。

在android中我使用StartActivityForResult然后覆盖OnResult,但我找不到类似的iOS方式。

我知道ViewDidLoad,ViewDidAppear等的覆盖,我正在寻找的是某种ViewDidGetPoppedBackTo(希望你得到它)。

还是有另一种更好的方法来实现这个目标吗?

3 个答案:

答案 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());   
}

注意 - 上述类和函数不完整,但应该让您了解此技术的工作原理。